JavaScript中 with的用法

刚看到这个东西的时候我是懵的,with是什么玩意,我咋从来没听过,抱着学习的态度,于是开干学习with。查阅了相关资料发现,不推荐使用with关键字,嘿嘿嘿,是不是可以不要学了,no,学无止境,有的底层代码会用到这个,或者面试官可能会问到。所以不管怎么说,还是了解一下的好。

with语句 扩展一个语句的作用域链。
语法:

        with (expression) {
                statement
        }

expression:将给定的表达式添加到在评估语句时使用的作用域链上。表达式周围的括号是必需的。
statement:任何语句。要执行多个语句,请使用一个块语句 ({ ... })对这些语句进行分组

基本用法 

var obj = {
    a: 1,
    b: 2,
    c: 3
}
with (obj) {
    a = 10
    b = 20
    c = 30
}
console.log(obj)    // {a: 10, b: 20, c: 30}

弊端

1、代码不易阅读,难以在作用域链上查找某个变量,难以决定应该在哪个对象上来取值

function fn(a,b) {
    with(b) {
        console.log(a);
    }
}

打印的这个a可能是形参b对象里的a变量,也可能是形参a的值,所以难以确定是哪个对象上来取值

2、数据泄露

function fn(obj) {
    with(obj) {
        a = 66
    }
}
var obj1 = {
    a:1
}
var obj2 = {
    b:2
}

fn(obj1)
console.log(obj1.a)   // 66

fn(obj2) 
console.log(obj2.a)   // undefined
console.log(a)  // 66   此时a已经泄露到全局变量里去了

首先创建obj1和obj2对象,前者有a属性,后者没有,我们先把obj1传到fn函数中,这个时候with去obj1找a属性,找到后修改a为66,这个时候obj1的a就被修改掉了,这是没问题的。但是我们把obj2传给fn函数,with会去obj2对象中去查找a属性,结果发现没有找到,那么with就会去全局作用域找,如果也没有找到,就会在全局作用域创建一个a变量,并且赋值为66。这就是with泄漏数据的全过程

3、性能下降

function fn1() {
    console.time('fn1')
    let obj = {
        arr: []
    }
    for(let i=0;i<100000;i++) {
        obj.arr[i] = i*2+3
    }
    console.timeEnd('fn1')
}
fn1()

function fn2() {
    console.time('fn2')
    let obj = {
        arr: []
    }
    with(obj) {
        for(let i=0;i<100000;i++) {
            arr[i] = i*2+3
        }
    }
    console.timeEnd('fn2')
}
fn2()

         可以看到with用的时间是普通代码逻辑的n倍,为啥with会这么慢呢?原因是 JavaScript 引擎会在编译阶段进行数项的性能优化。其中有些优化依赖于能够根据代码的词法进行静态分析,并预先确定所有变量和函数的定义位置,才能在执行过程中快速找到标识符。
        但如果引擎在代码中发现了 with,它只能简单地假设关于标识符位置的判断都是无效的,因为无法知道传递给 with 用来创建新词法作用域的对象的内容到底是什么。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JSON 是一种轻量级的数据交换格式,它可以让 Python 程序将对象编码为字符串,也可以将字符串解码为原来的 Python 对象。Python 使用 JSON 的主要功能有:编码 Python 对象为 JSON 字符串,解码 JSON 字符串为 Python 对象,读取和写入 JSON 文件。 ### 回答2: Python的JSON(JavaScript Object Notation)用于处理和解析JSON数据格式。JSON是一种轻量级的数据交换格式,常用于数据的序列化和传输。 Python提供了内置的json库,用于处理JSON数据。可以使用json模块的loads()方法将JSON格式的字符串转换为Python对象,使用dumps()方法将Python对象转换为JSON格式的字符串。 Python的JSON模块提供了以下方法来操作JSON数据: 1. json.loads():将JSON格式的字符串解析为Python对象。 2. json.dumps():将Python对象序列化为JSON格式的字符串。 3. json.load():从文件读取JSON格式的数据,并将其解析为Python对象。 4. json.dump():将Python对象序列化为JSON格式的数据,并写入到文件。 5. json.JSONEncoder():用于自定义编码器,将非JSON类型的对象转换为JSON类型的数据。 此外,Python的JSON模块还提供了许多其他的辅助函数和方法,用于处理JSON数据。例如,可以使用json.loads()方法解析含有嵌套结构的JSON数据,将其转换为对应的Python对象,然后可以通过访问对象的属性或者索引来获取相应的值。 使用Python的JSON模块可以方便地处理和解析JSON数据,适用于各种需要读取、修改、序列化和反序列化JSON数据的场景,如Web开发、数据交换等。 ### 回答3: 在Python,JSON(JavaScript对象表示法)是一种常用的数据格式,用于存储和交换数据。Python内置了用于处理JSON数据的模块json。 使用JSON的主要步骤如下: 1. 导入json模块:使用import json语句将模块导入到Python程序。 2. JSON序列化:将Python对象转换为JSON字符串的过程称为序列化。可以使用json.dumps()函数将Python对象序列化为JSON字符串。例如,使用json.dumps(obj)将Python字典obj转换为JSON字符串。 3. JSON反序列化:将JSON字符串转换为Python对象的过程称为反序列化。可以使用json.loads()函数将JSON字符串反序列化为Python对象。例如,使用json.loads(json_str)将JSON字符串json_str转换为Python字典。 4. 读取JSON文件:可以使用json.load()函数从JSON文件读取数据。例如,使用with open(file_path) as file: data = json.load(file)将JSON文件的内容加载为Python对象。 5. 写入JSON文件:可以使用json.dump()函数将Python对象写入JSON文件。例如,使用with open(file_path, 'w') as file: json.dump(obj, file)将Python对象obj写入JSON文件。 6. 处理JSON数据:可以使用Python的基本数据类型(例如字典、列表、字符串、数字等)来处理JSON数据。例如,可以使用obj['key']来访问JSON的键值对。 总结:Python的JSON模块提供了一种方便的方式来处理JSON数据。通过使用不同的方法,可以将Python对象序列化为JSON字符串,或将JSON字符串反序列化为Python对象。JSON数据可以以文件的形式读取和写入,并且可以使用Python的基本数据类型来处理JSON数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值