var obj = {
    name: "Simon",
    age: "20",
    clothing: {
        style: "simple",
        hipster: false

for(var propt in obj){
console.log(propt + ': ’ + obj[propt]);

变量propt如何表示对象的属性? 它不是内置方法或属性。 为什么它把对象中的每一个属性都拿出来?

Iterating over properties requires this additional hasOwnProperty check:

for (var prop in obj) {
    if (, prop)) {
        // do stuff

It's necessary because an object's prototype contains additional properties for the object which are technically part of the object. These additional properties are inherited from the base object class, but are still properties of obj.

hasOwnProperty simply checks to see if this is a property specific to this class, and not one inherited from the base class.

It's also possible to call hasOwnProperty through the object itself:

if (obj.hasOwnProperty(prop)) {
    // do stuff

But this will fail if the object has an unrelated field with the same name:

var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo');  // TypeError: hasOwnProperty is not a function

That's why it's safer to call it through Object.prototype instead:

var obj = { foo: 42, hasOwnProperty: 'lol' };, 'foo');  // true

The above answers are a bit annoying because they don't explain what you do inside the for loop after you ensure it's an object: YOU DON'T ACCESS IT DIRECTLY! You are actually only delivered the KEY that you need to apply to the OBJ:

var obj = {
  a: "foo",
  b: "bar",
  c: "foobar"

// We need to iterate the string keys (not the objects)
for(var someKey in obj)
// We check if this key exists in the obj
if (obj.hasOwnProperty(someKey))
// someKey is only the KEY (string)! Use it to get the obj:
var myActualPropFromObj = obj[someKey]; // Since dynamic, use [] since the key isn’t literally named “someKey”

// NOW you can treat it like an obj
var shouldBeBar = myActualPropFromObj.b;


This is all ECMA5 safe. Even works in the lame JS versions like Rhino ;)

let obj = {"a": 3, "b": 2, "6": "a"}

Object.keys(obj).forEach((item) => {console.log(“item”, obj[item])})

// a
// 3
// 2

Your for loop is iterating over all of the properties of the object obj. propt is defined in the first line of your for loop. It is a string that is a name of a property of the obj object. In the first iteration of the loop, propt would be "name".