js对象-属性遍历

为了加强js对象的认知,又刷了一题。

直接上题目:

找出对象 obj 不在原型链上的属性(注意这题测试例子的冒号后面也有一个空格~)
1、返回数组,格式为 key: value
2、结果数组不要求顺序

示例:

//输入
var C = function() {this.foo = ‘bar‘; this.baz = ‘bim‘;}; 

C.prototype.bop = ‘bip‘; 

iterate(new C());

//输出

["foo: bar", "baz: bim"]

//函数体function iterate(obj) {  //内容}

解题思路,iterate接收的函数obj,先打印出来。

{foo: "bar", baz: "bim"}

输出数组,很简单。

for in 循环,修改iterate函数

function iterate (obj){
  for(var key in obj){
       //这里用中括号是因为,key 是一个带引号的字符
       return key + ":" + obj[key]
    }
}

//返回

foo:bar
baz:bim
bop:bip

怎么多一个,但是我打印obj的时候,只有两个啊。

看了下for in ,只遍历一个对象的可枚举属性。

可枚举属性是啥?

可枚举属性是指那些内部 “可枚举” 标志设置为 true 的属性,对于通过直接的赋值和属性初始化的属性,该标识值默认为即为 true。可枚举的属性可以通过 for...in 循环进行遍历(除非该属性名是一个 Symbol)。属性的所有权是通过判断该属性是否直接属于某个对象决定的,而不是通过原型链继承的。一个对象的所有的属性可以一次性的获取到。有一些内置的方法可以用于判断、迭代/枚举以及获取对象的一个或一组属性,下表对这些方法进行了列举。对于部分不可用的类别,下方的示例代码对获取方法进行了演示。

相关链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Enumerability_and_ownership_of_properties

个人理解:for in 循环是可枚举属性,其实就是对象初始化的值,和后来通过直接给值 xx.proprototype.one = ‘11‘这种方式,如果要访问

console.log(obj.__proto__)

//返回

{bop: "bip", constructor: ?}

判断不可枚举的属性

in: 返回布尔值,有返回 true

if(!key in bop){
  //push 进数组
}

propertyIsEnumerable():返回布尔值,有返回 true

if(!obj[key].propertyIsEnumerable(‘bip‘)){
  //接着执行
}

hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性

if(!key.hasOwnProperty(‘bip‘)){
  //继续执行
}

Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。

return Object.getOwnPropertyNames(obj).map(function (key){
   //因为后面添加属性只会从后面添加
    return key + ":" + obj[key]

})

Object.getOwnPropertyNames() 返回一个数组,该数组对元素是 obj自身拥有的枚举或不可枚举属性名称字符串。 数组中枚举属性的顺序与通过 for...in 循环(或 Object.keys)迭代该对象属性时一致。数组中不可枚举属性的顺序未定义。

return Object.getOwnPropertyNames(obj).map(function (key){
   //因为后面添加属性只会从后面添加
    return key + ":" + obj[key]

})

这些是官方推荐的方法,具体的用法可以看上面的链接。

都可以实现上面的题目,可能会有一些兼容的问题,导致提交出错。

这里面 使用 hasOwnProperty 和 getOwnPropertyNames 都可以提交,不知道测试的内容到底是啥,Object.keys(obj),用他来循环push进去,因为返回的数组是三个,而value值是4个,第四个就是后面加上去的,所以这种方式也是可以的,这里推荐比较好的方法。

getOwnPropertyNames 

return Object.getOwnPropertyNames(obj).map(function (key) {
        return key + ‘: ‘ + obj[key];
    });

一道小小的题目,对于对象的基础知识算是一个考验。

原文地址:https://www.cnblogs.com/damai/p/8710081.html

时间: 2024-12-19 10:18:25

js对象-属性遍历的相关文章

js 对象属性遍历

function 对象属性遍历(){ var obj = {x:1,y:2,c:3};for (var name in obj){ alert ( obj[name] )} } function 数组(){ var 数组=[1,2,3,[1,2,4,5,7,8],4,5]; //数组嵌套数组 var 数组2=[ {x:100}, 2, [7,8,9], function(){ return 999; }(), "abc" ] var arr =new Array(10); arr[20

遍历js对象属性

<script type="text/javascript"> var p = { a:'a', e:{ a:'a', c:'c' }, b:'1', c:{ a:2, x:'fffff', y:{ ee:'fff', f:200 } } } ; //遍历js对象属性 var ObjInfo = { /** @param obj 要遍历的对象 @param placeholder 占位符,排版用,如空格 */ info : function(obj,placeholder)

js对象属性 通过点(.) 和 方括号([]) 的不同之处

//    js对象属性 通过点(.) 和 方括号([]) 的不同之处 //    1.点操作符: 静态的.右侧必须是一个以属性名称命名的简单标识符.属性名用一个标识符来表示.标识符必须直接出现再js程序中, //它们不是数据类型,因此程序无法修改它们. //    2.中括号操作符: 动态的.方括号里必须是一个计算结果为字符串的表达式,属性名通过字符串表示.字符串是js的数据类型, //再程序运行时可以修改和创建它们. // 主要有以下区别:     //1.[]--可以用变量作为属性名或访问

js对象属性的命名规则

JS标识符的命名规则,即变量的命名规则: 标识符只能由字母.数字.下划线和'$'组成 数字不可以作为标识符的首字符 对象属性的命名规则 通过[]操作符为对象添加属性时,属性名称可以是任何字符串(包括只包含空格的字符串和空字符串): 通过.操作符为对象添加属性时,属性名称必须是合法的标识符名称: 如果属性名包含非法的标识符字符,则只能采用obj["propertyName"]的形式: 如果属性名是合法的标识符,读取时即可以采用obj.propertyName,也可以采用obj["

JS对象属性中get/set与getter/setter是什么

在js属性描述符这部分有几个较难理解的名词概念,本文旨在描述对它们的理解,主要包括:[[Get]]/[[Put]].get/set.getter/setter几个概念的阐述,数据属性和访问器属性. 属性 首先我们要搞清楚属性的概念,属性是存储在特定命名位置的值,是对象的内容,属性并不直接存储在对象容器内部.属性有两种类型:数据属性和访问器属性.属性具备了属性描述符,用来描述属性拥有的特性. 属性描述符 属性描述符用来描述属性特性的(只有在内部才能用的特性),配置属性是否可读,是否可写,是否可枚举

js对象属性特征

enumerable和configurable (function(){ 'use strict'; var point={x:1,y:2,z:3}; Object.defineProperty(point,'x',{ enumerable:false,//对象属性是否可枚举 configurable:false //对象属性是否可配置,不能删除,注意值是可以修改的 }); delete point.x;//x属性不可配置,所以x属性没有被删除,在严格模式下会抛出错误,非严格模式忽略 conso

Js for in对象属性遍历问题

在Js中for in 是用来循环遍历对象的属性的,但是这个功能是有局限的,所遍历的属性必须是对象自定义的属性,对象的内置属性无法进行遍历. 当在对象中自定义属性覆盖了内置属性时: IE6/7/8浏览器,for in仍不支持遍历这些属性. chrome浏览器则可以对这些自定义的属性进行遍历. var enumerablesTest = { toString: 1 }; var enumerables = true; for (i in enumerablesTest) { enumerables

js对象属性的获取遍历

for-in循环会枚举一个对象的所有可枚举属性,并将属性名赋值给一个变量: es5引入Object.keys()方法,可以获取可枚举属性的名字的数组: for-in循环返回的和Object.keys()返回的可枚举属性有一个区别,for-in循环同时也会遍历原型属性,而Object.keys()只返回自有属性:

JS对象属性

1.数据属性 可以是js基本数据类型,对象类型,以$开始的属性表示私有属性, 具有value,可写性,可配置性(通过自有的方法配置),可枚举性,分别通过属性描述符value,writeable,configurable,enumerable标示 2.存取器属性(类似于面向对象语言中的方法) 具有读取,写入,可配置性(通过自有的方法配置),可枚举性(外界访问),通过set,get设置writeable,configurable,enumerable set setName(){}, get get