LiYajie web前端

web前端-js基础-javascript高级程序设计(第三版)

2017-03-06  本文已影响34人  LiYajie

严格模式和非严格模式的区别 'use strict'

  1. 严格模式下声明变量的时候必须带上var, 否则会报ReferenceError错误.
  2. 严格模式下不可使用eval或者arguments作为变量名, 否则会报语法错误.

基本的数据类型

  1. Undefined
  2. Null
  3. Boolean
  4. Number
  5. String
  6. Object 复杂数据类型, 本质由一组无序的键值对组成的.

typeof操作符, 因为ECMAScript是松散类型, 所以可以使用typeof来检测给定变量的数据类型. 返回的值都是字符串类型, 可能返回的值如下:

  1. undefined 如果这个值未定义
  2. boolean 如果这个值是布尔值
  3. string 如果这个值是字符串
  4. number 如果这个值是数值
  5. object 如果这个值是对象或者null
  6. function 如果这个值是函数

Number类型, 数值转换, Number() 函数转换规则如下

  1. 如果是Boolean类型, true 和 false分别被转换成 1和0;
  2. 如果是数字值, 只是简单的传入和反悔;
  3. 如果是null值, 则被转换成0;
  4. 如果是undefined , 则被转换成 NaN(Not a Number 不是一个数字), NaN类型是一个Number类型, typeof Number(undefined) == 'number' , 但是NaN != false
  5. 如果是字符串(string), 遵循一下规则:
    5.1 如果字符串中只包含数字 , 则转换成对应的数字, 如: Number('123') 则转换成数值型的123, 如果是Number('011') 则转换成11, 前面的先导0会被忽略.
    5.2 如果字符串中包含有效的浮点数字, 如:Number('1.1'), 则被转换成1.1, 同样如果前面有先导0, 则也会忽略.
    5.3 如果字符串中包含有效的十六进制格式, 则将其转换成相同的十进制, 如:Number('0xf') 被转换成15.
    5.4 如果字符串是空的, 不包含任何字符, 则将其转换成0, 如: Number('') == 0;
    5.5 如果字符串中包含除以上之外的字符, 则都被转换成NaN;
  6. 如果是对象, 则先调用对象的valueOf()方法, 然后依照前面的规则进行转换返回后的值, 如果结果是NaN, 则调用对象的toString()方法, 然后再次调用前面的规则转换返回后的字符串值;
    6.1 示例:
// Number类型对象
var a = new Number(1);
// 1. 调用 valueOf() 方法
var b = a.valueOf();
console.log(Number(b));// 如果这个值是NaN, 则调用toString()方法, 然后在转换
// String类型对象
var c = new String('123');
var d = c.valueOf();
console.log(Number(d));// 同上

parseInt()函数

因为Number()函数在转换字符串的时候比较复杂而且不够合理, 所以在处理整数的时候更常用parseInt()

parseInt()在转换字符串的时候, 更多的是看其是否符合数值模式, 它会忽略字符串前面的空格, 知道找到第一个非空格的字符, 如果第一个字符不是数字也不是负号, parseInt() 就会反悔NaN, 也就是说parseInt('')会返回NaN, 而Number('')返回0, 如果第一个字符是数字, 则parseInt()会解析第二个字符, 知道解析完所有后面的字符或者遇到了非数字字符, 如:'1234hello', 则parseInt()在解析到h的时候就发现不是数字字符, 则就停止解析, 直接返回 1234, 所以parseInt('1234hello') 返回 1234, hello会被完全忽略, 类似, 22.5 被解析成 22 , 以为小数点不是数字字符.

注意点:
parseInt() 函数在解析八进制字面量的字符串的时候, ECMAScript 3和ECMAScript 5有分歧;
如: var num = parseInt('070'); ECMAScript 3会解析成56(八进制), 而ECMAScript 5会解析成70(十进制), 原因是在ECMAScript 5 JavaScript引擎中, parseInt() 函数已经不具有解析八进制的能力了, 因此会导致前面的先导0 被忽略, 从而将这个值解析成十进制的 70, 即使在非严格模式下也是如此.
为了消除以上困惑, parseInt()函数提供了第二个参数, 第二个参数就是来指定前面要转换的字符串是几进制的, 如下:

var num1 = parseInt('10', 2); // 结果就是 2 (按照二进制进行解析)
var num2 = parseInt('10', 8); // 结果就是 8(按照八进制进行解析)
var num3 = parseInt('10', 16); // 结果就是 16(按照十六进制进行解析)
var num4 = parseInt('10', 10) ; // 结果就是10( 按照十进制进行解析)

parseFloat()函数

parseInt()函数不同的是它始终会解析到字符串的末尾, 或者解析到遇见一个无效的浮点数字字符为止, 如果浮点数中出现两个点的时候, 则第二个点无效, 则停止解析, 如:parseFloat('1.22.3')则被解析成1.22, parseFloat('1.22hsdfsd');则被解析成1.22, 因为第二个点和h都不是有效的浮点数字字符.

转换为字符串

Number, Boolean, Object, String 这些类型都有toString()方法.
js中处理null和undefined没有toString()方法, 其他的都有此方法, 此方法就是返回一个字符串副本.

对数情况下使用toString()的时候不必穿参数, 也可通过传递基数来输出二进制, 八进制, 十六进制表示的值. 如:

var n = 10;
console.log(n.toString()); // '10'
console.log(n.toString(2)); // '0101'
console.log(n.toString(8)); // '12'
console.log(n.toString(16)); // 'a'

当我们在不知道值是不是null或者undefined的时候我们可以使用String(), 这个函数可以将任意类型的值转换成字符串, 规则如下:

  1. 如果值有toString()方法, 则调用该方法, 并返回相应的结果;
  2. 如果值是null则返回字符串的'null'
  3. 如果值是undefined 则返回字符串 'undefined'

如果要把值转换成字符串, 还有一个方法就是这个值加上一个空字符串即可: 如:

var a = 123;//这个是值类型
var b = a + ''; //这个的结果是String类型
console.log(typeof b); // 打印结果是 string

未完待续...

上一篇下一篇

猜你喜欢

热点阅读