javascript严格模式
如何开启严格模式
- js文件顶部写 'use strict'
- es6,新增的class关键字类中的代码都是严格模式
- html文件中的script标签属性内,写上type="module"
为什么需要严格模式
1.避免未定义的变量
let variable = 10
vraiable = 100
console.log(variable, vraiable)
//上面的代码中,vraiable其实是不小心拼错的变量
//但是我们却能正常访问,没有报变量未定义异常
//因为这个变量实际上已经成为了全局变量,成为了window对象的一个属性
//使用严格模式时,则会变量未定义异常错误,我们就能发现我们其实拼错了一个变量
2.防止修改只读属性
const obj = {
get age(){
return 10;
}
}
Object.defineProperty(obj, "name", { writable: false, value: "jiejie" })
obj.age = 20
obj.name = "john"
console.log(obj.age)
console.log(obj.name);
//未使用严格模式时,修改age和name的语句能够正常运行,但是它们并不能改变实际的值
//在严格模式下,将会抛出错误,让开发人员及时发现问题
3.防止删除不可删除属性
const obj = {
}
Object.defineProperty(obj, "name", { configurable:false, value: "jiejie", })
delete obj.name
console.log(obj.name)
//上诉的obj对象的name属性时不能被删除的,即使使用了delete关键字删除
//obj对象的name属性依然能被访问,但是解释器没有给我们抛出任何错误
//在严格模式下,将会抛出错误让我们即时发现问题
4.防止函数参数被覆盖
function toArray(a, a, c) {
return [...arguments]
}
function toArray2(a, a, c) {
return [a,a,c];
}
console.log(toArray(1, 2, 3));
console.log(toArray2(1,2,3));
输出如下:
[ 1, 2, 3 ]
[ 2, 2, 3 ]
//在toArray2这个方法中,第二参数名字a把第一个覆盖了
//所以这个函数作用域内的a的值都为第二个参数的值
//当然,在严格模式报错
5.确保前导为0o的八进制数
"use strict"
console.log(015)
console.log(0o15);
//在非严格模式下,两种表示八进制数的方式都能正常运行
//但在严格模式,前导为0开头的八进制数将会报错
6.防止在原始值上定义属性
在 JavaScript 中有5种原始类型(也称为简单数据类型): String 、 Number 、 Boolean 、 Undefined 和 Null,如果一个变量是这五个类型的情况下,给他们像对象一样定义属性是无效的,在严格模式下将会报错
7.防止函数参数数组的值被修改
function sum(a, b) {
a=10
return [a+b,arguments[0]+arguments[1]]
}
console.log(sum(1,2))
//在严格模式下,输出[12,3]
//非严格模式。输出[3,3]