在目前的学习和工作中还没有使用到过严格模式,不过刷到面试题有关于严格模式的,今天统计一下严格模式的特点。
严格模式的目的
1.消除JavaScript语法中一些不合理不严谨的地方。
2.消除代码中一些不安全的地方,保证代码的安全运行。
3.提高JavaScript的运行效率。
4.为以后新版本的JavaScript做好铺垫
使用严格模式
在js脚本开头使用字符串'use strict'
<script>
'use strict' //启用严格模式
let a = 3
console.log(a);
</script>
严格模式的特点
1.变量必须先声明再使用,普通模式可以正常使用不报错
<script>
a = 3
console.log(a); //会正常输出3
</script>
<script>
'use strict'
a = 3
console.log(a); //会报错
let b = 3
console.log(b) //正常输出3
</script>
- delete不能删除显式声明的变量和显式声明的对象(显示声明的对象属性可删除)
总结:普通模式下不能删除但不报错的情况,现在都报错
a = 'a'
delete a // 删除a,不报错
a = {name: 'zb'}
delete a.name // 删除a.name,不报错
delete a // 删除a,不报错
let a = 'a'
delete a // 不删除a,不报错
let a = {name:'zb'}
delete a.name // 删除a.name,不报错
delete a // 不删除a,不报错
// ---------------------严格模式必须声明变量
'use strict'
let a = {name: 'zb'}
delete a.name // 删除a.name,不报错
delete a // 报错
'use strict'
let a = 'a'
delete a // 报错
3.函数中不允许有同名的参数,正常模式不报错
function a(b,b){
console.log(b);
console.log(b);
}
a('11','22') // 输出22 22
'use strict'
function a(b,b){
console.log(b);
console.log(b);
}
a('11','22') // 会报错
4.不能为只读属性赋值,正常模式不报错
let obj = {age: 18, sex: '男'}
Object.defineProperty(obj,'name',{
value: 'zb',
writable: false, // 只读不可写
enumerable: true,
})
obj.name = 'zbzb'
console.log(obj.name); // zb,重新赋值失败但不报错
'use strict'
let obj = {age: 18, sex: '男'}
Object.defineProperty(obj,'name',{
value: 'zb',
writable: false, // 只读不可写
enumerable: true,
})
obj.name = 'zbzb' // 报错
5.不允许在 非函数 的代码块内声明函数,比如if语句和for语句
console.log(a); // undefined,很奇怪为什么是undefined不是function
if(1 === 1){
function a(){}
}
console.log(a); // undefined
for(item in 3){
function a(){}
}
'use strict'
console.log(a); // 报错
if(1 === 1){
function a(){}
}
'use strict'
console.log(a); // 报错
for(item in 3){
function a(){}
}
6.不允许使用八进制
console.log(0b10, 0B10, '二进制'); // 2 2 二进制
console.log(010, 0o10, 0O10, '八进制'); // 8 8 8 八进制
console.log(0x10, 0X10, '十六进制'); // 16 16 十六进制
'use strict'
console.log(0b10, 0B10, '二进制'); // 2 2 二进制
// console.log(010, 0o10, 0O10, '八进制'); // 报错
console.log(0x10, 0X10, '十六进制'); // 16 16 十六进制