js严格模式?

95 阅读2分钟

在目前的学习和工作中还没有使用到过严格模式,不过刷到面试题有关于严格模式的,今天统计一下严格模式的特点。

严格模式的目的

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>
  1. 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 十六进制