严格模式与非严格模式下变量和对象的不同

简介: 严格模式与非严格模式下变量和对象的不同

严格模式

首先我们先了解一下什么是严格模式。


1、概念:

严格模式是JavaScript中的一种限制性更轻的变种方式。严格模式不是一个子集:它在语义上与正常代码有着明显的差异。


不支持严格模式的浏览器与支持模式的浏览器行为也不一样,所以不要在未经严格模式特性测试情况下使用严格模式。


严格模式可以与非严格模式共存,所以脚本可以主键的选择性加入严格模式。


2、目的

首先,严格模式会将JavaScript陷阱直接变成明显的错误。


其次,严格模式修正了一些引擎难以优化的错误:同样的代码有些时候严格模式会比非严格模式下更快。


第三,严格模式禁用了一下有可能在未来版本中定义的语法。


3、开启严格模式

严格模式分为全局严格模式和函数严格模式。


在JavaScript中想要开启严格模式,需要在所有代码之前,定义一个不会赋给任何变量的字符串:

"use strict"; //或者 'use strict'

(1)全局开启严格模式

// 开启全局严格模式 --作用于全局
'use strict'
// 定义一个变量a,不使用关键字var
 a = 1;
console.log(a);//报错信息为:a is not defined

(2)函数开启严格模式

function fun(){
    'use strict'
    // var v = 200;严格模式下此句正确
    v = 200;
    console.log(v);
}
fun();//报错:v is not defined

一、严格模式下不同场景的区别(变量的区别)

1、禁止意外创建变量

在严格模式下不允许意外创建全局变量。

示例代码如下:

    // 全局开启严格模式,定义变量v和w的方式都是错误的
// 'use strict'
v = 100;
console.log(v);//100
function fn() {
    // 'use strict' 开启局部严格模式,定义变量w的方式是错误的
    // 定义局部变量w
    w = 200;
    console.log(w);//200
}
fn();
//在非严格模式下定义的局部变量,JavaScript会自动将其提升为全局变量。
//故此处打印输出w,结果为200
console.log(w);//200

2、静默失败转为异常

大概意思就是:将问题直接转化为错误(如语法错误或运行时错误)。

//开启严格模式,将问题直接转化为报错
'use strict'
const v = 100;//(定义常量)
v = 1.14;//重新赋值(为变量)
console.log(v);

3、禁用delete关键字

在严格模式下,不能对变量使用delete运算符。

(1)对变量使用delete关键字

// 开启严格模式
'use strict'
var v = 100;
delete v;//非严格模式下:此处为静默失败,既没有报错也没有删除变量v
console.log(v);//100
//开启严格模式后,改为报错Delete of an unqualified identifier in strict mode.

(2)对数组和对方法属性使用delete关键字

严格模式下对数组和对方法属性使用delete关键字,效果不变。

// 开启严格模式
'use strict'
// 1、严格模式下删除数组内容
var arr = [1,2,3,4]
delete arr[0];
console.log(arr);//[ <1 empty item>, 2, 3, 4 ]
// 2、严格模式下delete函数的属性
var obj  =  {
    name : '猪猪侠 '
}
delete obj.name;
console.log(obj.name)//undefined

4、对变量名的限制

在严格模式下,JavaScript对变量名也有限制。特别不能使用如下内容作为变量名:


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5VMn0gG2-1604150829289)(C:\Users\24817\AppData\Roaming\Typora\typora-user-images\image-20201031183835973.png)]


示例代码如下:

// 开启严格模式
'use strict'
var static = 100;
console.log(static);//100
// 非严格模式下,static可以用作变量名,但在严格模式下不可以使用保留字

二、严格模式下不同场景的区别(对象的区别)

1、不可删除的属性

在严格模式下,不能使用delete运算符删除不可删除的属性。

// 开启严格模式
'use strict'
 delete Object.prototype; //不可删除Object的原有属性
console.log(Object.prototype);//非严格模式下,结果会静默失败,结果为:{}。
// 严格模式下delete会报错
// 严格模式并没有做到十全十美,一些JavaScript自带的属性也是可以删除的
delete Math.random;
console.log(Math.random);//严格模式下:undefined

2、属性名必须唯一

在严格模式下,一个对象内的所有属性名在对象内必须唯一。

示例代码如下:

// 开启严格模式
'use strict';
// 对象具有相同名称的属性时 - 编辑器报错
var obj = {
    name:'猪猪侠',
    name:'超人强'
}
console.log(obj.name);

注:编辑器报错,运行结果不报错。如下图所示:

3、只读属性的赋值

在严格模式下,不能为一个只读的属性进行重新赋值。

示例代码如下:

'use strict'
var obj = {
    name:'猪猪侠'
}
// 用于判断指定属性是否为只读属性
var result = Object.getOwnPropertyDescriptor(obj,'name');
console.log(result);//{ value: '猪猪侠', writable: true, enumerable: true, configurable: true }
// 定义对象obj的只读属性
Object.defineProperty(obj,'age',{
    value:18,writable:false //新增只读age属性。
});
// 针对只读属性进行修改操作
obj.age = 80;
console.log(obj.age);//非严格模式下,产生静默失败,结果为:18
// 使用try...catch语句进行捕捉提示
try{
obj.age = 80;
console.log(obj.age);//非严格模式下,产生静默失败,结果为:18
}catch (e) {
    console.log('此属性不可修改')
}

4、不可扩展的对象

在严格模式下,不可为不可扩展的对象添加新属性或新方法。

// 开启严格模式
'use strict'
var obj = function () {
};
// 设置对象 obj是一个不可扩展的对象
Object.preventExtensions(obj);
// 为对象新增属性和方法
// obj.name = '猪猪侠';
// obj.age = 19;
obj.prototype.age = 10; //可通过原型属性为其新增属性(对象为函数时)
console.log(obj.prototype);
目录
相关文章
|
5月前
|
JavaScript 前端开发 数据安全/隐私保护
闭包对于保护私有变量和函数的作用
JavaScript中的闭包用于创建私有作用域,保护变量和函数不被外部直接访问。它们实现封装和信息隐藏,防止全局命名冲突,确保数据安全和稳定性。闭包还支持访问控制和持久状态保持,常用于模块化、数据隐藏等,增强代码的可维护性、可重用性和安全性。
|
4月前
|
自然语言处理 JavaScript 前端开发
JavaScript闭包是函数访问外部作用域变量的能力体现,它用于封装私有变量、持久化状态、避免全局污染和处理异步操作。
【6月更文挑战第25天】JavaScript闭包是函数访问外部作用域变量的能力体现,它用于封装私有变量、持久化状态、避免全局污染和处理异步操作。闭包基于作用域链和垃圾回收机制,允许函数记住其定义时的环境。例如,`createCounter`函数返回的内部函数能访问并更新`count`,每次调用`counter()`计数器递增,展示了闭包维持状态的特性。
46 5
|
4月前
|
JavaScript 前端开发
null、未定义或未声明的变量之间有什么区别
null、未定义或未声明的变量之间有什么区别
null、undefined和未声明变量的具体应用场景
null、undefined和未声明变量的具体应用场景
|
5月前
|
JavaScript 前端开发 安全
严格模式和正常模式的区别
严格模式和正常模式的区别
32 1
|
5月前
|
JavaScript 前端开发
JavaScript闭包允许内部函数访问并保留外部函数的变量,即使外部函数执行结束
【5月更文挑战第13天】JavaScript闭包允许内部函数访问并保留外部函数的变量,即使外部函数执行结束。在游戏开发中,闭包常用于创建独立状态的角色实例。例如,`createCharacter`函数生成角色,内部函数(如`getHealth`、`setHealth`)形成闭包,保存角色的属性(如生命值)。这样,每个角色实例都有自己的变量副本,不互相影响,从而实现角色系统的独立性。
46 0
|
5月前
|
存储 JavaScript 前端开发
每日一道javascript面试题(九)函数的参数可以和函数体中的变量重名吗
每日一道javascript面试题(九)函数的参数可以和函数体中的变量重名吗
|
5月前
|
安全 JavaScript 前端开发
和为严格模式
和为严格模式
|
5月前
|
JavaScript 前端开发 编译器
TypeScript 中的变量声明:变量声明的语法、变量的作用域、变量的类型推断和类型断言
TypeScript 中的变量声明:变量声明的语法、变量的作用域、变量的类型推断和类型断言
65 1
|
JavaScript 前端开发
JavaScirpt基础 之 变量 之 声明变量
声明(创建) JavaScript 变量
71 0
JavaScirpt基础 之 变量 之 声明变量