js es6 delete
2023-09-14 09:01:09 时间
前言
首先delete 不同于nodejs delete,看下有什么不同。
正文
var test=5;
delete test;
console.log(test);
结果是test没有受到任何影响,依旧可以输出5。
再来一个:
var x={y:{z:5}};
var data=x.y;
console.log(x.y);//输出{z:5}
delete x.y;
console.log(x);//输出{}
console.log(x.y);//输出undef
console.log(data);//输出{z:5}
那么这个时候可以明白其实我们删除的是x与y的联系,y的内存地址其实还在的。
我们知道delete是有返回值的,那么这么来的吧,看下它是否删除成功.
var test=5;
var flag=delete test;
console.log(flag);
这个时候返回为false,那么它是返回不成功的。
那么得出一个疑问,到底什么可以删除什么不可以删除?
问题探索
猜想:
是否只能删除的是它的属性? 而且必须是自定义的属性?
疑问:上面删除test的时候其实是global的一个属性,那么自定义属性不成立。
那么是否是global之外的自定义属性都可以删除呢?
var arr = [1,3,4,6,73,2];
delete arr[2];
console.log(arr.length); // 6
console.log(arr[2]); //undefiend consoel.log(arr);
//[ 1, 3, , 6, 73, 2 ]
那么可以看到其实删除的真的是内存引用,还是讲指针指向了undefind?
经过前面的案例,其实是将指针指向了undefind,也就是未初始化状态。
这里我们可以看到其实delete对元组和object处理方式是不同的,那么我们
不能当做单一的来处理这一系列问题。
提出疑问:
到底delete 对象的属性的时候是否让该属性置空了还是删除了呢?
看个荔枝:
var test={
k:5
}
var testx=test;
delete test.k;
console.log(test);//{}
console.log(testx);//{}
看见其被删除了,而不是置空了。
再来看下隐式全局变量和显示全局变量:
x=6;
var y=7;
delete x;
delete y;
console.log(y);//7
console.log(x);//undefine
可以删除隐式的声明,不能删除显示的声明。
那么最后看下别人的删除数组的例子:
方式一:
var arr = [1,3,5,21,3,4,53,21,5,2];
arr.forEach(function(val,index){ if(val < 10){ delete arr[index]; } }) console.log(arr); //[ , , , 21, , , 53, 21, , ] //可以使用filter过滤掉空值 [ 21, 53, 21 ];
arr = arr.filter(function(val){return val});
方式二:
for(var i=0;i<arr.length;i++){
if(arr[i] < 10){
arr.splice(i,1);
i--;
}
})
console.log(arr);// [ 3, 21, 4, 53, 21, 2 ]
可以想象一下,其实方式一的效率更高,因为其不用每一次都去创建一个新的数组。
相关文章
- ES6中的模板字符串改变html_vue事件绑定修饰符
- es6 模板字符串_es6 方法模板渲染
- html如何只刷新页面指定,js控制页面刷新 JS刷新当前页面的几种方法总结
- 每天3分钟,重学ES6-ES12(一)字面量的增强 解构
- 每天3分钟,重学ES6-ES12(二)var let const的选择
- ES6-异步遍历器(三)
- es6扩展运算符、concat方法合并多个数组
- ES6新增特性
- Uncaught SyntaxError: Cannot use import statement outside a module的解决方法(使用Es6语法引入js对象文件报错)
- JS模块化—CJS&AMD&CMD&ES6-前端面试知识点查漏补缺_2023-03-13
- JS动态引入js、CSS动态创建script/link/style标签详解编程语言
- js获取url参数代码实例分享(JS操作URL)