前端之旅前端程序员

JavaScript数据类型中易被忽略的点

2016-07-24  本文已影响171人  7091a52ac9e5

String

var multiLine = " first \n second \n third line "
alert(multiLine) // alerts 3 lines
var str = 'I\'m the Valrus'

var str = "My\n" // 3 .`\n`也算其中之一
alert(str.length)  // 3

Number, Math

Array

Objects

var ladder = {
  step: 0,
  up: function() {
    this.step++
    return this
  },
  down: function() {
    this.step--
    return this
  },
  showStep: function() {
    alert(this.step)
    return this
  }
}
ladder.up().up().down().up().down().showStep()  // 1

对象转换为简单数据类型

转化为字符串

alert( {key: 'value'} ) // toString for Objects outputs: [object Object]
alert( [1,2] )          // toString for Arrays lists elements "1,2"
alert( new Date )       // toString for Dates outputs the date as a string
  var user = {
    firstName: 'John',
    toString: function() {
      return 'User ' + this.firstName
    }
  }
  alert( user )  // User John

转换为数值(两种情况下发生,非常常见)

装换为布尔值

  alert( [0] == 0 )  // true
  alert( "\n0\n" == 0 ) // true
  alert( "\n0\n" == false ) // true
// 
  if ([0]) alert(1)  // 1, if treats [0] as true
  if ("\n0\n") alert(2) // 2, if treats "\n0\n" as true

再看一个比较奇怪的例子

alert( [] == ![] ) // true
```分析一下这个例子有利于更加好的理解类型装换
- 首先,看右边![],逻辑非对[]进行布尔转换,依据上面的装换表,数组其实也是对象,object装换为真。所以右边![] = !true = false;
- 再看左边,对象与简单类型比较时,会按数值方式装换,没有valueOf,将使用toString进行装换(以逗号分隔的字符串)那么就装换为一个空的字符串''=false;
- 所以二者相等;

检测一下你是否真的掌握了数值装换,看看下面的题目能不能理解

```javascript
6 / "3" = 2
"2" * "3" = 6
4 + 5 + "px" = "9px"
"$" + 4 + 5 = "$45"
"4" - 2 = 2
"4px" - 2 = NaN
7 / 0 = Infinity
{}[0] = undefined
parseInt("09") = "0" or "9" // octal or decimal, depends on the browser
5 && 2 = 2
2 && 5 = 5
5 || 0 = 5
0 || 5 = 5

说明

本文对各类型并未做详尽的说明,想了解更多资料可以参考以下文章

上一篇下一篇

猜你喜欢

热点阅读