# 错误
# getCookie出现问题
导致页面的菜单无法点击
- idea工程设置编码utf-8
- 浏览器清理缓存,尤其cookie
# 鲜为人知的JavaScript陷阱
# 箭头函数和对象字面量
箭头函数提供了更简短的语法,其中一个特性是你可以将函数编写为具有隐式返回值的 lambda 表达式。编写函数样式的代码时这就很顺手,比如说有时你必须使用一个函数映射一些数组的情况。使用常规函数可能会多出很多空行。
例如
const numbers = [1, 2, 3, 4];
numbers.map(function(n) {
return n * n;
});
2
3
4
但如果你尝试映射到对象,那么语法可能就不是你直觉期望的那样了。例如,假设我们试图将数字映射到包含如下值的对象数组中
const numbers = [1, 2, 3, 4];
numbers.map(n => { value: n });
2
解决方法非常微妙。我们只需要将对象包装在括号中,就可以将它变成一个表达式而不是一个块语句,如下所示:
const numbers = [1, 2, 3, 4];
numbers.map(n => ({ value: n }));
2
# 箭头函数和绑定
箭头函数另一个需要注意的点是,它们
没有自己的 this 绑定,意味着它们的 this 值和封闭词法作用域的 this 值是一样的。
箭头函数很简洁,但不能替换需要 this 绑定的常规成员函数
# 自动分号插入
# 浅集合
集合较浅,意味着重复的数组和具有相同值的对象,这将导致集合中有多个条目
let set = new Set();
set.add([1, 2, 3]);
set.add([1, 2, 3]);
console.log(set.length);//2
2
3
4
let set = new Set();
set.add([1, 2, 3].join(','));
set.add([1, 2, 3].join(','));
console.log(set.size);//1
2
3
4
# 类与暂时死区
在 JavaScript 中,常规函数被提升到词法作用域的顶部,这意味着下面的示例将按预期工作:
let segment = new Segment();
function Segment() {
this.x = 0;
this.y = 0;
}
2
3
4
5
但是对于类来说并非如此。类实际上没有被提升,并且在尝试使用它们之前需要在词法作用域内对其进行完全定义。例如:
let segment = new Segment();
class Segment {
constructor() {
this.x = 0;
this.y = 0;
}
}
2
3
4
5
6
7
尝试构造类的新实例时会导致 ReferenceError,因为它们没有像函数那样被提升。
# Finally
# js报错集锦_10
- 1、
Uncaught TypeError: Cannot read property
如果你是一个 JavaScript 开发人员,可能你看到这个错误的次数比你敢承认的要多。当你读取一个未定义的对象的属性或调用其方法时,这个错误会在 Chrome 中出现。 您可以很容易的在 Chrome 开发者控制台中进行测试。
发生这种情况的原因很多,但常见的一种是在渲染 UI 组件时对于状态的初始化操作不当。
我们来看一个在真实应用程序中发生的例子:我们选择 React,但该情况也同样适用于 Angular、Vue 或任何其他框架。
class Quiz extends Component {
componentWillMount() {
axios.get('/thedata').then(res => {
this.setState({items: res.data});
});
}
render() {
return (
<ul>
{this.state.items.map(item =>
<li key={item.id}>{item.name}</li>
)}
</ul>
);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
组件的状态(例如 this.state)开始于 undefined。
当异步获取数据时,不管它是在构造函数 componentWillMount 还是 componentDidMount 中获取的,组件在数据加载之前至少会呈现一次,当 Quiz 第一次呈现时,this.state.items 是 undefined。
解决办法很容易,构造函数初始化
class Quiz extends Component {
// Added this:
constructor(props) {
super(props);
// Assign state itself, and a default value for items
this.state = {
items: []
};
}
componentWillMount() {
axios.get('/thedata').then(res => {
this.setState({items: res.data});
});
}
render() {
return (
<ul>
{this.state.items.map(item =>
<li key={item.id}>{item.name}</li>
)}
</ul>
);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- 2、
TypeError: ‘undefined’ is not an object
这是在 Safari 中读取属性或调用未定义对象上的方法时发生的错误。您可以在 Safari Developer Console 中轻松测试。这与第一点中提到的 Chrome 的错误基本相同,但 Safari 使用了不同的错误消息提示语。 - 3、
TypeError: null is not an object
这是在 Safari 中读取属性或调用空对象上的方法时发生的错误。
undefined 通常是一个尚未分配的变量,而 null 表示该值为空。 要验证它们不相等,请尝试使用严格的相等运算符 ===
- 4、
(unknown): Script error - 5、
TypeError: Object doesn’t support property
这相当于 Chrome 中的 “TypeError:”undefined“ is not a function” 错误。 - 7、
Uncaught RangeError
当你调用一个不终止的递归函数就会发生这种错误。您可以在 Chrome 开发者控制台中进行测试。 - 8、
TypeError: Cannot read property ‘length’
您通常会在数组中找到定义的长度,但是如果数组未初始化或者变量在另一个上下文中,则可能会遇到此错误。让我们用下面的例子来理解这个错误 - 9、
Uncaught TypeError: Cannot set property
当我们尝试访问一个未定义的变量时,它总是返回 undefined,我们不能获取或设置任何未定义的属性。 - 10、
ReferenceError: event is not defined
当您尝试访问未定义的变量或超出当前作用域的变量时,会引发此错误。