我知道的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。
注意问题
- 0.1 + 0.2 === 0.3; // false
二进制浮点数中的 0.1 和 0.2 并不是十分精确,它们相加的结果并非刚好等于 0.3,而是一个比较接近的数字 0.30000000000000004,所以条件判断结果为 false。 - 42.toFixed( 3 );// 无效语法
因为第一个 . 被视为 number 的一部分,第二个 . 是属性访问 运算符。
// 下面的语法都有效:
(42).toFixed( 3 ); // "42.000"
0.42.toFixed( 3 ); // "0.420"
42..toFixed( 3 ); // "42.000"
- 判断整数
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
苟同。