1.javascript数组原型方法。

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jstest</title>
</head>
<body>
<script>
var arr = ["1","2","3"];
arr.baz = "baz";
console.log(arr); // 数组也是对象,添加属性后,并不会改变它的长度;
var myObj = {
a:2
}
console.log( Object.getOwnPropertyDescriptor(myObj,"a"));
Object.defineProperty(myObj,"a",{
value:3,
writable:false,
enumerable:true,
configurable:true
}) myObj.a = 4;
console.log(myObj.a); //3 定义属性描述不可写,无法修改值
//属性描述符里有get和set两个,分别表示读写。 //当configurable为false时,属性没法修改 ,没法delete删除,有个例外,可以把writable由true改为false。
// 只要属性是可配置的,就可以用 Object.defineProperty()设置属性描述符。 /*要设置对象或属性不可变:
1.常量对象:结合 writable:fasle和configurable:false创建常量属性(不可修改,重定义,删除)。
2.禁止扩展:禁止对象添加新属性,保留已有属性,使用 Object.preventExtensions(obj);
3.密封:Object.seal() 会创建一个密封的对象,实际上是在现有对象的基础上调用preventExtensions,
并把所有现有属性标记为false;
4.冻结:Object.freeze() 会创建一个冻结对象,他在原有对象的基础上,调用seal()并把所有数据访问的属性标记为
writable:false,这是级别最高的不可变性。
*/
var b={ a:undefined }
console.log(b.a); //undefined
console.log(b.b); //undefined /*
上面的两个结果都为undefined,区别在于内部的get操作。
可以判断属性的存在性,去区别这两种情况:
*/
console.log("a" in b); //true
console.log("b" in b); //false
// 或者
console.log(b.hasOwnProperty("a")); //true
console.log(b.hasOwnProperty("b")); //false
/*
上面两种方式的区别在于:
1.in会检查属性是否存在于对象或其原型链中,
2.hasOwnProperty只检查属性是否存在于对象中,不检查原型链。 注意:in操作符检查的是属性,不是值, 2 in [1,2]并不是true,
*/ /*
可枚举性:设为false的时候,它不会出现在对象属性的循环遍历中。下面例子:
*/
var obj= {}
Object.defineProperty(obj,"a",{
value:2,
enumerable:true
});
console.log(obj.a);
Object.defineProperty(obj,"b",{
value:3,
enumerable:false
})
console.log(obj.b);
// 检测存在性
console.log("a" in obj);
console.log("b" in obj); console.log( obj.hasOwnProperty("a"));
console.log(obj.hasOwnProperty("b")); // 进行循环
for(var k in obj){
console.log(k,obj[k]) // 结果 a 2
}
/* 以上结果表明 enumerable设为false的时候,属性仍存在,但不会被遍历。
同时,for in 循环,用来遍历数组的话,有可能会把数组中的非数字索引遍历到,所以
数组循环,最好用传统的for循环,看下面例子:
*/
var arr = [1,2,3]
arr.baz = "baz";
for(var k in arr){
console.log(k,arr[k]);
}
/*结果 0 1
1 2
2 3
baz baz
*/
/*
forEach() 会遍历数组中的所有值,并忽略回调函数的返回值。
*/
var arr = [1,2,3,4,5]
arr.forEach(function(value){
console.log(value,"forEach");
}) //every() 函数一直运行,直到回调函数返回false值,或者遍历结束。
//这里需要返回值,是说每次循环都要有返回值,也就是说
//if条件不满足的时候,也要进行return
var i = 0;
arr.every(function(value){
i+=value;
console.log("every",value)
// return value<3
if(i>20){
return false
}else{
return true
}
})
// 跟上边的every()类似,some() 函数会在返回值是真的时候停止。 简单例子:
arr.some(function(value){
console.log(value,"some");
return value>2
}) //不通过下标,直接遍历数组:ES6 方法;
for(var v of arr){
console.log(v,"for...of");
}
//for...of... 实际上是通过对象的迭代器对象,调用next()方法来实现遍历的。
//下面用原生内置的 @@iterator手动遍历:
var arr = [1,2,3,4];
var it = arr[Symbol.iterator]();
console.log(it.next().value,"iterator");
console.log(it.next().value,"iterator");
console.log(it.next().value,"iterator");
console.log(it.next().value,"iterator");
console.log(it.next().value,"iterator"); //给对象定义迭代器:举例:
var obj = {
a:2,
b:3
}
Object.defineProperty(obj,Symbol.iterator,{
enumerable:false,
writable:false,
configurable:true,
value:function(){
var o = this,idx = 0,ks = Object.keys(o);
return {
next:function(){
return {
value:o[ks[idx++]],
done:(idx>ks.length)
}
}
}
}
})
//根据定义好的iterator 进行手动迭代:
var it = obj[Symbol.iterator]();
console.log(it.next(),"手动迭代")
console.log(it.next(),"手动迭代")
console.log(it.next(),"手动迭代")
//for of 遍历
for(var v of obj){
console.log(v,"forof");
} // 你可以定义一个无限迭代:
var randoms = {
[Symbol.iterator]:function(){
return {
next:function(){
return { value:Math.random()}
}
}
}
};
var randoms_pool = [];
for(var n of randoms){
randoms_pool.push(n);
if(randoms_pool.length ===100){
console.log(randoms_pool);
break;
}
}
//这个迭代器会生成无数个随机数,因此添加break阻止。 //原型
var obj = {
a:2
};
var newobj = Object.create(obj) console.log("a" in newobj); //true
console.log(newobj.hasOwnProperty("a")); //false
// 上面的结果表明,a属性,存在于newobj的原型链中,但不属于它本身。
newobj.a++;
console.log(newobj.a); //3
console.log(obj.a); //2
//上面就是一个隐式屏蔽,下层不会改变上层的值,还有一个情况就是,上层会改变下层的值 /*
我们只需要两个对象就可以判断他们之间的关系,举例:
b是否出现在c的原型链中: b.isPrototypeOf(c)
也可以直接获取一个对象的原型链:
*/
var new2obj = Object.create(newobj);
console.log(Object.getPrototypeOf(new2obj));
</script>
</body>
</html>

javascript数组原型方法的更多相关文章

  1. Javascript数组原型方法大全以及实例!!

    数组的方法有数组原型方法,也有从object对象继承来的方法,这里我们只介绍数组的原型方法,数组原型方法主要有以下这些: join() push()和pop() shift() 和 unshift() ...

  2. JavaScript数组处理方法

    JavaScript中创建数组有两种方式 (一)使用 Array 构造函数: var arr1 = new Array(); //创建一个空数组 var arr2 = new Array(20); / ...

  3. JavaScript数组对象方法

    数组的方法:首先,数组的方法有数组原型方法,也有从object对象继承来的方法.这里只详细说明一下数组的原型方法. (1)join:把数组中的所有元素放入一个字符串.元素通过指定的分隔符进行分隔. 例 ...

  4. JavaScript数组归并方法reduce

    示例代码: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF ...

  5. JavaScript——数组——slice方法

    JavaScript--数组--slice方法 JavaScript中的slice方法类似于字符串的substring方法,作用是对数组进行截取. slice方法有两个参数,indexStart 和 ...

  6. 数组原型方法调用及函数apply调用时 类数组参数在IE8下的问题

    当函数以 apply 方式调用时, 传参方式是一个由各个参数组成的数组或类数组(一个有length属性的对象),传入参数个数取决于 length 的值,例如,某个对象 args.length=3; a ...

  7. JavaScript数组去重方法及测试结果

    最近看到一些人的去面试web前端,都说碰到过问JavaScript数组去重的问题,我也学习了一下做下总结. 实际上最有代表性也就三种方法:数组双重循环,对象哈希,排序后去重. 这三种方法我都做了性能测 ...

  8. JavaScript 数组去重方法总结

    1.遍历数组法: 这应该是最简单的去重方法(实现思路:新建一新数组,遍历数组,值不在新数组就加入该新数组中) // 遍历数组去重法 function unique(arr){ var _arr = [ ...

  9. JavaScript 数组去重 方法汇总

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 关于Python Package下的Module import方式[转]

    2012年有一个目标我没有达成,那就是深入学习和使用Python语言.这个目标被其他学习任务和工作无情的抢占了,当然最主要的原因还是我重视不够^_^. 近期恰逢有一些Python工程的开发工作要做,就 ...

  2. 休息,考完了MCSD

    终于考完了~这次的证书签名居然还是鲍尔默的.

  3. (KMP 水)Wow! Such Doge! -- hdu -- 4847

    http://acm.hdu.edu.cn/showproblem.php?pid=4847 Wow! Such Doge! Time Limit:1000MS     Memory Limit:32 ...

  4. 建立多人协作git仓库/git 仓库权限控制(SSH)

    转载文章请保留出处  http://blog.csdn.net/defeattroy/article/details/13775499 git仓库是多人协作使用的,可以基于很多种协议,例如http.g ...

  5. 16、Docker的网络-host和none

    16.1 none   创建一个容器使用网络none: [root@docker ~]# docker run -d --name test1 --network none busybox /bin/ ...

  6. java web 项目启动的根目录,以及项目启动后使用的端口具体是哪一个

    1.今天启动项目发现一直找不到网页,原来是自己浏览器地址的根目录出现了问题,那么系统中的根目录(也就是项目名)到底是哪个,究竟以哪个为基准? 这里有一地方不能忽视:见图片 在普通的java web项目 ...

  7. ASP.NET Core 2 学习笔记(三)中间件

    之前ASP.NET中使用的HTTP Modules及HTTP Handlers,在ASP.NET Core中已不复存在,取而代之的是Middleware.Middleware除了简化了HTTP Mod ...

  8. 先装VS2008之后,又装了2013,然后启动VS2008提示“Tools Version”有问题?

    这个网上资料一搜很多,我就是按照下面这个链接去解决的,删除 “14.0” 整个键值文件夹之后重启VS2008就好了, 注意:上面第一张图是我在网上找的08和10版本弹出的错误,我自己弹出的是提示14. ...

  9. 【cocos2d-x 手游研发----地图活起来了】

    谈到地图不少人都说要做地图编辑器了,但是我暂时绕过这一步,如果不用寻路地图就不能移动?寻路就是会绕过障碍物的算法. 我做了一个简单的地图的思想,就是地图分层3层:背景层.可行区域层.遮罩层,但是地图就 ...

  10. Javassist简介

    Javassist是一个开源的分析.编辑和创建Java字节码的类库.是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的.它已加入了开放源代码JBoss 应用服务器 ...