xiaoxiaosaohuo/Note

我知道的JS(一)

Opened this issue · 1 comments

值和类型

我们会经常碰到类型转换,比如把字符串"2"转化为Number类型,当然还有很多隐式的转换,不留意就会出现意想不到的结果。

内置类型

  • null
  • undefined
  • string
  • number
  • boolean
  • object
  • symbol

可以用typeof检测类型,typeof 运算符总是会返回一个字符串

有一个特殊的问题是

typeof null === "object"; // true

所以应该用复合条件来检测:

var a = null;
(!a && typeof a === "object"); // true

null和undefined,区别

这两个都是表示没有值,null表示不该有值,undefined表示本来应该有值,但是缺少值,未定义。

null==undefined //true

在JS里,function和array类型都是object的子类。
JavaScript 中的变量是没有类型的,只有值才有。变量可以随时持有任何类型的值。一个变量可以现在被赋值为字符串类型值,随后又被赋值为 数字类型值。
变量是没有类型的,只有值才有,变量可以随时持有任何类型的值

值得注意的几个问题

 已在作用域中声明但还没有赋值的变量,是 undefined 的。相反,还没有在作用域中声明 过的变量,是 undeclared 的
undefined 类型只有一个值,即 undefined。null 类型也只有一个值,即 null。它们的名
称既是类型也是值。
undefined 和 null 常被用来表示“空的”值或“不是值”的值。二者之间有一些细微的差 别。例如:
• null 指空值(empty value)
• undefined 指没有值(missing value)
• null 是一个特殊关键字,不是标识符,我们不能将其当作变量来使用和赋值。然而
undefined 却是一个标识符,可以被当作变量来使用和赋值。

NaN

NaN 是一个“警戒值”(sentinel value,有特殊用途的常规值),用于指出数字类型中的错误 情况,即“执行数学运算没有成功,这是失败后返回的结果”。

NaN是一个特殊值,它和自身不相等,是唯一一个非自反(自反,reflexive,即x === x不 成立)的值。

可以使用Number.isNaN(..) 来判断一个值是否是 NaN。

零值

var a = 0 / -3; // -0
var b = 0 * -3; // -0

有些应用程序中的数据需要以级数形式来表示(比如动画帧的移动速度),数字的符号位 (sign)用来代表其他信息(比如移动的方向)。此时如果一个值为 0 的变量失去了它的符
号位,它的方向信息就会丢失。所以保留 0 值的符号位可以防止这类情况发生。

void 运算符

void并不改变表达式的结果, 只是让表达式不返回值:

var a = 42;
console.log( void a, a );

按惯例我们用void 0来获得undefined(这主要源自C语言,当然使用void true或其他 void 表达式也是可以的)。void 0、void 1 和 undefined 之间并没有实质上的区别。

如果要将代码中的值(如表达式的返回值)设为 undefined,就可以使用 void。

注意问题

  1. 0.1 + 0.2 === 0.3; // false
    二进制浮点数中的 0.1 和 0.2 并不是十分精确,它们相加的结果并非刚好等于 0.3,而是一个比较接近的数字 0.30000000000000004,所以条件判断结果为 false。
  2. 42.toFixed( 3 );// 无效语法
因为第一个 . 被视为 number 的一部分,第二个 . 是属性访问 运算符。
// 下面的语法都有效:
(42).toFixed( 3 ); // "42.000"
0.42.toFixed( 3 ); // "0.420"
42..toFixed( 3 ); // "42.000"
  1. 判断整数
Number.isInteger(0);         // true
Number.isInteger(1);         // true
Number.isInteger(-100000);   // true

Number.isInteger(0.1);       // false
Number.isInteger(Math.PI);   // false  


#Polyfill
Number.isInteger = Number.isInteger || function(value) {
  return typeof value === 'number' && 
    isFinite(value) && 
    Math.floor(value) === value;
};
0 === -0
null == undefined
NaN != NaN
NaN !== NaN

大部分元素都可以通过 Object.prototype.toString 的结果进行判断

var string = new String('wxj');
Object.prototype.toString.call(string); // => '[object String]'

可以判断的类型有:

Arguments, Function, String, Number, Date, RegExp, Error, Symbol, Map, WeakMap, Set, WeakSet

苟同。