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

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

严格模式

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


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);
目录
相关文章
|
Ubuntu
Ubuntu 20.04 安装 Fira Code 字体
Ubuntu 20.04 安装 Fira Code 字体
1392 0
|
3月前
|
人工智能 监控 搜索推荐
使用LangGraph从零构建多智能体AI系统:实现智能协作的完整指南
本文将通过构建AI研究助手的完整案例,展示如何使用LangGraph框架实现这种架构转变,从理论基础到具体实现,帮助你掌握下一代AI系统的构建方法。
821 0
使用LangGraph从零构建多智能体AI系统:实现智能协作的完整指南
|
计算机视觉
AutoCAD *.dxf文件解析,使用dxflib搞定polyline/spline/ellipse等复杂图形(★firecat推荐★)
AutoCAD *.dxf文件解析,使用dxflib搞定polyline/spline/ellipse等复杂图形(★firecat推荐★)
2677 0
AutoCAD *.dxf文件解析,使用dxflib搞定polyline/spline/ellipse等复杂图形(★firecat推荐★)
|
10月前
|
存储 数据采集 JSON
你知道吗?html_table可以提取的不止是表格
`html_table` 是一种强大的工具,不仅用于HTML表格解析,还在现代爬虫技术中发挥重要作用。它可以提取、整合、分析和传输多种类型的关键数据。本文从四个方面探讨其功能:关键数据提取(如财经网站的股票信息)、零散信息整合(如电商网站的产品详情)、数据对比分析(如手机性能参数对比)和数据存储与传输(如转换为CSV/JSON格式)。通过Python代码示例,展示了如何利用代理IP、多线程和自定义请求头提高爬虫效率,实现对复杂网页数据的全面抓取和利用。
345 12
你知道吗?html_table可以提取的不止是表格
|
存储 监控 安全
【实战经验】记录项目开发常见的8个难题
风沙席地起,战马踏风归!
618 116
|
存储 前端开发 JavaScript
深度理解Promise状态变化_配合小Demo
本文通过代码示例深入探讨了JavaScript中Promise对象的三种状态(pending、rejected、resolved)及其变化过程,解释了在什么情况下Promise会从pending状态变为resolved或rejected状态,并演示了如何通过Promise的状态管理异步操作。
363 0
深度理解Promise状态变化_配合小Demo
|
移动开发 小程序 前端开发
uniapp中uview组件库丰富的Table 表格的使用方法
uniapp中uview组件库丰富的Table 表格的使用方法
1580 2
|
SQL Java 关系型数据库
技术心得记录:开源BI分析工具Metabase配置与完全使用手册
技术心得记录:开源BI分析工具Metabase配置与完全使用手册
2286 0
|
XML 存储 编解码
svg的viewBox、width和height的设置说明
svg的是没有边界的,svg画布只是用于展示svg世界中某一个范围的内容,而对于超过了svg画布范围的内容,则会被遮挡。默认svg画布默认显示世界坐标下原点坐标的width*height面积的矩形视野。
|
前端开发
uniapp去除滚动条的方法
uniapp去除滚动条的方法