Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >javascript中的for in 和 in运算符

javascript中的for in 和 in运算符

作者头像
空空云
发布于 2018-09-27 03:58:05
发布于 2018-09-27 03:58:05
73200
代码可运行
举报
文章被收录于专栏:大前端_Web大前端_Web
运行总次数:0
代码可运行

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://cloud.tencent.com/developer/article/1347590

之前只知道有for in循环,不清楚in运算符。for in 和 in 遍历对象在原型上增加的属性也会遍历出来。 in运算符的规则:对运算符左右两个操作数的要求比较严格。in运算符要求第1个(左边的)操作数必须是字符串类型或可以转换为字符串类型的其他类型,而第2个(右边的)操作数必须是数组、对象或者new生成的对象。只有第1个操作数的值是第2个操作数的属性名,才会返回true,否则返回false。 for in 和in运算符的key在对象中是对象的属性,在Array中是数组的索引

for in

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var obj = {
    "key1":"value1",
    "key2":"value2",
    "key3":"value3"
};
function enumeKey(){
    for(var key in obj ){
        console.log(key);
    }
}
enumeKey() //key1 key2 key3

数组的遍历无法保证顺序,尽量避免使用,for-in循环用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”。所以最好数组使用正常的for循环(还可以使用ECMA-262 标准的for each),对象使用for-in循环。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 对象
var man = {
   hands: 2,
   legs: 2,
   heads: 1
};

// 在代码的某个地方
// 一个方法添加给了所有对象
if (typeof Object.prototype.clone === "undefined") {
   Object.prototype.clone = function () {};
}

上面代码,我们有一个使用对象字面量定义的名叫man的对象。在man定义完成后的某个地方,在对象原型上增加了一个很有用的名叫 clone()的方法。此原型链是实时的,这就意味着所有的对象自动可以访问新的方法。为了避免枚举man的时候出现clone()方法,你需要应用hasOwnProperty()方法过滤原型属性。如果不做过滤,会导致clone()函数显示出来,在大多数情况下这是不希望出现的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1.
// for-in 循环
for (var i in man) {
   if (man.hasOwnProperty(i)) { // 过滤
      console.log(i, ":", man[i]);
   }
}
/* 控制台显示结果
hands : 2
legs : 2
heads : 1
*/

// 2.
// 反面例子:
// for-in loop without checking hasOwnProperty()
for (var i in man) {
   console.log(i, ":", man[i]);
}
/*
控制台显示结果
hands : 2
legs : 2
heads : 1
clone: function()
*/

另外一种使用hasOwnProperty()的形式是取消Object.prototype上的方法,好处在于在man对象重新定义hasOwnProperty情况下避免命名冲突。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (var i in man) {
   if (Object.prototype.hasOwnProperty.call(man, i)) { // 过滤
      console.log(i, ":", man[i]);
   }
}
//另外一种写法,方法变量缓存,jquery的大部分写法
var i, hasOwn = Object.prototype.hasOwnProperty;
for (i in man) {
    if (hasOwn.call(man, i)) { // 过滤
        console.log(i, ":", man[i]);
    }
}

javascript中in运算符

注意事项:

对于一般的对象属性需要用字符串指定属性的名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var mycar = {make: "Honda", model: "Accord", year: 1998};
"make" in mycar  // returns true
"model" in mycar // returns true

//对于数组属性需要指定数字形式的索引值来表示数组的属性名称(固有属性除外,如length)。

// Arrays
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
0 in trees        // returns true
3 in trees        // returns true
6 in trees        // returns false
"bay" in trees    // returns false (you must specify the index number,
                  // not the value at that index)
"length" in trees // returns true (length is an Array property)

//in的右边必须是一个对象,如:你可以指定一个用String构造器生成的,但是不能指定字符串直接量的形式:

var color1 = new String("green");
"length" in color1 // returns true
var color2 = "coral";
"length" in color2 // generates an error (color is not a String object)

//如果你使用delete操作符删除了一个属性,再次用in检查时,会返回false,如:

var mycar = {make: "Honda", model: "Accord", year: 1998};
delete mycar.make;
"make" in mycar;  // returns false

var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
delete trees[3];
3 in trees; // returns false


//如果你把一个属性值设为undefined,但是没有使用delete操作符,使用in检查,会返回true.

var mycar = {make: "Honda", model: "Accord", year: 1998};
mycar.make = undefined;
"make" in mycar;  // returns true


var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
trees[3] = undefined;
3 in trees; // returns true

javascript对象运算符

  • in 判断左侧运算数是否为右侧运算数的成员
  • instanceof 判断对象是否属于某个类或构造函数
  • new 根据构造函数创建一个新的对象,并初始化该对象
  • delete 删除指定对象的属性,数组元素或变量
  • .及[] 存取对象和数组元素,如果把key赋值为变量var,只能用var
  • () 函数调用,改变运算符优先级等
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年04月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Javascript 里的 in
写js的时候需要遍历一个对象的属性,把属性名和属性值都提出来,之前没遇到这种需求,查了一下可以用for in的方式.
李维亮
2021/07/09
3650
前端入门10-JavaScript语法之对象声明正文-对象
作为一个前端小白,入门跟着这几个来源学习,感谢作者的分享,在其基础上,通过自己的理解,梳理出的知识点,或许有遗漏,或许有些理解是错误的,如有发现,欢迎指点下。
请叫我大苏
2018/12/24
8880
《JavaScript 模式》读书笔记(2)— 基本技巧2
  for循环经常用在遍历数组或者类数组对象,如引数(arguments)和HTML容器(HTMLColltion)对象。通常for循环模式使用如下:
zaking
2020/03/19
4040
javascript模式 读书笔记一
模式是指一个通用问题的解决方案。 模式分三种 设计模式 编码模式:javascript特有的
lilugirl
2019/05/26
1K0
9个实用的JavaScript开发技巧,你一定要看下
英文 | https://javascript.plainenglish.io/9-javascript-hacks-nobody-talks-about-f15445e301ca
前端达人
2021/04/22
7260
详解JavaScript的Object对象
Object 是 JavaScript 的一种 数据类型 ,用于存储各种键值集合和更复杂的实体,几乎所有对象都是 Object 类型的实例,它们都会从 Object.prototype 继承属性和方法,虽然大部分属性都会被覆盖(shadowed)或者说被重写了(overridden)。
Learn-anything.cn
2021/12/22
6650
JavaScript深入浅出补充——(一)数据类型,表达式和运算符
项目基本做完,在进行下一阶段学习之前先看视频学习回顾一下JavaScript 一、数据类型 JavaScript中有五种原始类型和一种对象类型 JavaScript弱类型语言中隐式转换 num-0 字
二十三年蝉
2018/02/28
7950
JavaScript深入浅出补充——(一)数据类型,表达式和运算符
大话 JavaScript(Speaking JavaScript):第十一章到第十五章
JavaScript 对所有数字都使用单一类型:它将它们全部视为浮点数。但是,如果小数点后没有数字,则不显示小数点:
ApacheCN_飞龙
2024/01/12
6880
JavaScript大小比较 赋值运算符详解
比较运算中的操作数可以是任意类型的值,但是在执行运算时,会被转换为数字或字符串,然后再进行比较。如果是数字,则比较大小;如果是字符串,则根据字符编码表中的编号值从左到右逐个比较每个字符。
用户3519280
2023/07/07
6540
JavaScript 新手的踩坑日记
在1995年5月,Eich 大神在10天内就写出了第一个脚本语言的版本,JavaScript 的第一个代号是 Mocha,Marc Andreesen 起的这个名字。由于商标问题以及很多产品已经使用了 Live 的前缀,网景市场部将它改名为 LiveScript。在1995年11月底,Navigator 2.0B3 发行,其中包含了该语言的原型,这个版本相比之前没有什么大的变化。在1995年12月初,Java 语言发展壮大,Sun 把 Java 的商标授权给了网景。这个语言被再次改名,变成了最终的名字——JavaScript。在之后的1997年1月,标准化以后,就成为现在的 ECMAScript。
一缕殇流化隐半边冰霜
2024/01/26
1570
JavaScript 新手的踩坑日记
【Web前端】JavaScript 对象基础
JavaScript 是一种以对象为基础的编程语言,操作数据时,实际都是在处理对象。可以使用简单的数据类型(如字符串、数字和布尔值)来实现一些功能,但深入了解 JavaScript 对象的运作,将使你能够编写更强大和灵活的代码。
一条晒干的咸鱼
2024/11/19
730
【Web前端】JavaScript 对象基础
javascript语言精粹(蝴蝶书)-笔记
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/51340630
空空云
2018/09/27
1.9K0
送你58道JavaScript面试题(上)
之前翻译过前阵子 github很火的 javascript-questions:送你43道JavaScript面试题
ConardLi
2019/08/21
7930
送你58道JavaScript面试题(上)
03JavaScript运算符
由此可以得到:加法运算时,无论字符串是什么都会进行拼接;而减法、除法、乘法则会尽力转换字符串为number类型,如果无法转换结果为NaN,否则返回运算结果。
Dreamy.TZK
2020/04/09
4500
JavaScript 新手的踩坑日记
在1995年5月,Eich 大神在10天内就写出了第一个脚本语言的版本,JavaScript 的第一个代号是 Mocha,Marc Andreesen 起的这个名字。由于商标问题以及很多产品已经使用了 Live 的前缀,网景市场部将它改名为 LiveScript。在1995年11月底,Navigator 2.0B3 发行,其中包含了该语言的原型,这个版本相比之前没有什么大的变化。在1995年12月初,Java 语言发展壮大,Sun 把 Java 的商标授权给了网景。这个语言被再次改名,变成了最终的名字——JavaScript。在之后的1997年1月,标准化以后,就成为现在的 ECMAScript。
一缕殇流化隐半边冰霜
2018/08/29
6170
JavaScript 新手的踩坑日记
重学js之JavaScript基本概念(下)- 运算符
注意:逻辑非也可以用于将一个值转化为与其对应的布尔值。而同时使用两个逻辑非操作符,实际上会模拟Boolean()转型函数的行为。其中,第一个逻辑非操作符会基于无论什么操作数返回一个布尔值,而第二个逻辑非操作则对该布尔值进行求反,于是就得到这个值真正对应的布尔值。
执行上下文
2022/07/26
7280
JS 手写: instanceof
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
Cellinlab
2023/05/17
4300
JavaScript的奇技淫巧
在 JavaScript 中 数组(Array)随处可见,使用ECMAScript 6 中的新特性 扩展运算符 我们可以做很多很棒事情。
前端进击者
2021/07/27
5540
前端入门9-JavaScript语法之运算符声明正文-运算符
作为一个前端小白,入门跟着这几个来源学习,感谢作者的分享,在其基础上,通过自己的理解,梳理出的知识点,或许有遗漏,或许有些理解是错误的,如有发现,欢迎指点下。
请叫我大苏
2018/12/21
5020
javaScript 引用类型
    另外还有一种创建对象的方式是使用Object.create()方法,它是一个静态方法。  
用户1197315
2019/12/02
1.2K0
相关推荐
Javascript 里的 in
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验