在我的节点应用程序中,为什么同样的东西会给出不同的输出?

时间:2018-01-19 19:35:15

标签: node.js ejs

regexp.exec(r.getValue())

这里arr [i]的值是Memory

var b = "pp.specifications.full_specs."; var c = arr[i];

它在控制台上打印pp.specifications.full_specs.Memory

但是当我使用

var a = b+c; console.log(a);

然后将json对象打印为:

console.log(pp.specifications.full_specs.Memory);

只要a的值包含pp.specifications.full_specs.Memory;

那么获得不同产出的原因是什么?

2 个答案:

答案 0 :(得分:0)

b是示例中的一个字符串,任何与字符串连接的内容(即:"" + {})都会产生一个字符串。 JavaScript将通过类型toString()函数(Also known as Type Coercion)对字符串进行隐式类型转换。当对象通过.toString()转换为字符串时,该字符串的值为[object Object]。知道这一点,将字符串b与对象c连接起来会产生字符串。

"pp.specifications.full_specs.[object Object]"

console.log(pp.specifications.full_specs.Memory)实际打印pp.specifications.full_specs.Memory

中存储的对象

如果要将字符串与Object的实际字符串表示形式连接,请使用JSON.stringify()获取对象的字符串化版本。我想这就是你想要做的事情。

let a = b + JSON.stringify(c, null, 2)
console.log(a)

// REPL output
pp.specifications.full_specs.{
  "Series": "Inspiron",
  "Model": "A562103SIN9",
  "Utility": "Everyday Use",
  "OS": "Windows 10 Home (64-bit)",
  "Dimensions": "274.73 x 384.9 x 25.44 mm",
  "Weight": "2.62 Kg",
  "Warranty": "1 Year Onsite Warranty"
}

上面将输出一个b的字符串,与c的JSON表示相连,如上所述。上面的输出格式化,就好像它是在REPL的上下文中打印一样。在浏览器或文件上下文中,JSON.stringify(c, null, 2)包括空格和新行的转义,如下所示。

  

' pp.specifications.full_specs。{\ n" Series":" Inspiron",&n" Model":" A562103SIN9& #34;,\ n"实用程序":"日常使用",\ n"操作系统":" Windows 10 Home(64位)&#34 34;,\ n"尺寸":" 274.73 x 384.9 x 25.44 mm",\ n"重量":" 2.62 Kg",#34; n"保修":" 1年现场保修" \ n}'

答案 1 :(得分:-1)

之间存在一个基本的区别

console.log(pp.specifications.full_specs.Memory);

console.log("pp.specifications.full_specs.Memory");

注意引号!

所以表达式:console.log(pp.specifications.full_specs.Memory);可以从左到右阅读:

打印到pp.specifications.full_specs.Memory的输出值,在获取其属性pp然后其属性specifications等后,这是full_specs个对象的值。

"pp.specifications.full_specs.Memory"仅表示一段文字。

您的代码中发生的事情现在应该更加清晰:

// B is piece of text
var b = "pp.specifications.full_specs.";
// C is some other value - let's say also textual one
var c = arr[i]
// So b+c will mean add text to some other text
// It's expected that the result of such operations is concatenated text
// So then console.log(b+c) will mean
// Print the concatenated text from b and c
// And it's just plain text
console.log(b+c);

//It's the same as:
console.log("pp.specifications.full_specs.Memory");

// And this one means print some specific object attributes
// which is different operation!
console.log(pp.specifications.full_specs.Memory);

如果您想通过文本访问对象,可以执行以下操作:

var d = eval(b+c);

这是非常危险的,应避免使用eval但我只是想展示基本的想法。 Eval执行字符串就好像它们是代码一样。 所以字符串"pp.specifications.full_specs.Memory"将作为实际对象的值进行求值(是的!)。

由于eval可以执行任何操作,因此应该始终避免它,而且它是超级的!

相反,如果你想在某些文字输入上访问某些pp基本属性,你可以这样做:

pp['specifications']['full_specs']['Memory']

由于pp.x表示法等同于表达式:pp['x']

我希望我的回答可以帮助您更好地理解Javascript机制:)