Javascript常见错误
Object的赋值错误
错误示例
let alerts_init = {'a':1, 'b':2}
let alerts = alerts_init
alerts = {'c':3}
console.log(alerts_init)
你会惊喜的发现alerts_init的值被改变了,变成和alerts一样。
作为两个对象,不能这样用。
正确示例
let alerts = Object.assign({}, alerts_init)
这样改变alerts,alerts_init还是保持原样。
Object的赋值错误2(对象内包含对象)
错误示例
template.vars = {
'warn': {
'type': 'int',
'value': 80}
}
task.vars = template.vars
//或
task.vars = Object.assign({}, template.vars)
如果直接赋值:task.vars = template.vars
就会出现问题,因为task.vars的值一改变,template.vars的值也跟着改变。
原因是他们都是同一个对象。
采用Object.assign()是否可以解决问题?
也不行。
因为Object.assign是浅复制,warn的值是一个对象,仍然会将该对象传递过去,导致template.vars的值也会跟着变。
正确示例
task.vars = JSON.parse(JSON.stringify(template.vars))
这样改变task,template还是保持原样。
Array为空的判断
错误示例
let alerts = []
if(alerts == [])
alerts的ID和[]的ID是不一样的,不能这样比较。(如果是python,这是对的)
正确示例
let alerts = []
if(alerts.length == 0)
console.log的值自相矛盾
let alert_inform = {
email: ['xxx']
wechat: ['yyy']
}
console.log('alert inform %o', alert_inform)
console.log('email %o', alert_inform.email)
当在chrome的控制台展开alert_inform查看时,里面的email可能和下面的console.log的email值不一样,到底怎么回事?
可以参考这个:https://stackoverflow.com/questions/11284663/console-log-shows-the-changed-value-of-a-variable-before-the-value-actually-ch
简单的说,就是chrome没有修复一个bug。这个bug就是在用console.log打印一个对象时,这个对象里面的值是可能被后面的修改所改变(无语。。。)。要解决,就要打印对象时,用深拷贝。。。