Open jyzwf opened 6 years ago
今天看到一个笔试题,如下:
a = 1 delete a console.log(typeof a) var b = 2 delete b console.log(typeof b)
大家可以猜猜看结果是啥
我们先来看看 delete 的用法 根据 mdn上的描述:
delete
mdn
delete 操作符用于删除对象的某个属性;如果没有指向这个属性的引用,那它最终会被释放
语法啥的就自个去看吧,(就是不写唉,,,略略略)
现在我们来看看 delete 的注意点
true
原型链
同名的属性
delete操作只会在自身的属性上起作用
var
全局作用域
函数的作用域
let
const
不可设置
Object.defineProperty()
光说不做假把式,我们来实际检测下
var obj = {} delete obj.x // true console.log(obj) //{}
确实如第一条所述
var proto = { d1:2 } var obj = Object.create(proto) obj.d1 = 3 delete obj.d1 // true console.log(obj)
这里我们拿 1 来举例
1
var obj1 = {} delete obj1 // false console.log(obj1) //{} ------说明没有删除成功 obj2 = {} delete obj2 // true console.log(obj2) // 删除成功了,所以报错了
let o={} delete o // false const b = {} delete b // false
let obj = {} Object.defineProperty(obj,'x',{ value:66, configurable:false }) delete obj.x // false
在严格模式下,如果对一个变量的 直接引用、函数的参数 或者 函数名使用delete操作,将会抛出 语法错误(SyntaxError)
直接引用
函数的参数
函数名
语法错误(SyntaxError)
任何使用 var 声明的变量都会被标记为 不可设置 的
"use strict" var obj = {} delete obj
'use strict' var d = (function (x) { delete x var b = 23 delete b return b })(2) // 同样报错
'use strict' var d = function(){console.log(66)} delete d // 报错
'use strict' var t=6 Object.getOwnPropertyDescriptor(window,'t')
delete Math.PI // false
所以不起作用
var Person=function(){ } Person.age = 555 delete Person.age // true
当用 delete 操作符删除一个数组元素时,被删除的元素已经不再属于该数组
var ary= [1,2,3,4,5]; delete ary[3]; if (3 in ary) { // 这里不会执行 }
经过上面的讲解,我们可以轻松解决开头的问题了^_^
ok ,撒花,完结,,溜了溜了~~
今天看到一个笔试题,如下:
大家可以猜猜看结果是啥
我们先来看看
delete
的用法 根据mdn
上的描述:语法啥的就自个去看吧,(就是不写唉,,,略略略)
现在我们来看看
delete
的注意点delete
将不会起任何作用,但仍会返回true
原型链
上有一个与待删除属性同名的属性
,那么删除属性之后,对象会使用原型链上的那个属性(也就是说,delete操作只会在自身的属性上起作用
)var
声明的属性不能从全局作用域
或函数的作用域
中删除。let
或const
声明的属性不能够从它被声明的作用域中删除不可设置
的(Non-configurable)属性不能被移除。这意味着像Math, Array, Object内置对象的属性以及使用Object.defineProperty()
方法设置为不可设置的属性不能被删除光说不做假把式,我们来实际检测下
1
确实如第一条所述
2
3
这里我们拿
1
来举例4
5
严格模式与非严格模式的对比
在严格模式下,如果对一个变量的
直接引用
、函数的参数
或者函数名
使用delete操作,将会抛出语法错误(SyntaxError)
任何使用
var
声明的变量都会被标记为不可设置
的1
2
3
4
静态属性
1, 內建静态属性
所以不起作用
2. 自定义
删除数组元素
当用 delete 操作符删除一个数组元素时,被删除的元素已经不再属于该数组
经过上面的讲解,我们可以轻松解决开头的问题了^_^
ok ,撒花,完结,,溜了溜了~~