类型是值
的内部特征,它定义了值的行为
,以使其区别于其余值。数组
一、七种内置类型:安全
二、咱们能够用typeof
运算符来查看值的类型,它返回的是类型的字符串值
。bash
三、由于typeof null === 'object',因此检测null值的类型须要下面这段复合条件函数
var a = null;
(!a && typeof a == "object"); // true
复制代码
四、函数其实是object的一个"子类型"
。具体的说,函数是"可调用对象",它有一个内部属性[[call]]
,该属性使其能够被调用。工具
五、函数对象的length属性
是其声明的参数的个数
ui
一、Javascript中的变量是没有类型的
,只有值
才有。变量能够随时持有任何类型的值。spa
二、已在做用域中声明
但还没有赋值
的变量,是undefined
。prototype
三、还没有在做用域中声明过得变量
,是undeclared
。code
var a;
typeof a // "undefined"
typeof b // "undefined" 没有声明仍是undefined 这主要是由于typeof的安全防范机制
复制代码
// 这样是安全的
if(typeof DEBUG ! == "undefined"){
console.log('xxxxx')
}
复制代码
(function(){
function FeatureXYZ(){};
function doSomethingCool(){
var helper = (typeof FeatureXYZ !== "undefined") ? FeatureXYZ :
function(){
// default feature
}
var a = helper();
}
doSomethingCool()
})()
复制代码
function doSomethingCool(FeatureXYZ){
var helper = FeatureXYZ || function(){}
var val = helper();
// ...
}
复制代码
一、数组能够容纳任何类型的值,能够是字符串
、数字
、对象
,甚至是其余数组
。对象
二、使用delete运算符能够将单元从数组中删除,可是请注意,单元删除后,数组的length属性并不会发生变化
。
三、在建立"稀疏"数组(即含有空白或空缺单元的数组)。a[1]的值为undefined,但这与将其显示赋值为undefined(a[1] = undefined)仍是有所区别。
var a = [];
a[0] = 1;
a[2] = [3];
a[1] // undefined
a.length // 3
复制代码
四、数组经过数字进行索引
,可是他们也是对象,因此也能够包含字符串键值
和属性
(但这些并不计算在数组长度内
)。
五、若是字符串键值可以被强制类型转换为十进制数字的话
,它就会被当作数字索引来处理
var a = [];
a[0] = 1;
a['foo'] = 2;
a.length // 1
a['foobar'] //2
a.foobar //2
var a = [];
a['13'] = 42;
a.length // 14
复制代码
六、类数组=>数组的方式
function foo(){
var arr = Array.prototype.slice.call(arguments);
arr.push('bam');
console.log(arr)
}
foo('bar','baz') // ['bar','baz','bam']
复制代码
var arr = Array.from(arguments)
复制代码
一、Javascript中字符串是不可变的(指字符串的成员函数不会改变其原始值
,而是建立并返回一个新的字符串
),而数组是可变的。
二、字符串没有reverse方法,变通方法能够先转换为数组而后转换为字符串。
var a = 'foo'
var c = a.split("").reverse().join("")
c; //"oof"
复制代码
一、Javascript中的数字类型是基于IEEE754标准
来实现的,该标准一般也被称为"浮点数"。Javascript使用的是"双精度"格式。
二、toFixed() 方法能够指定小数部分的显示位数
,若是指定的小数部分的显示位数多于实际位数就用0补齐。
三、toPrecision() 方法用来指定有效数位
的显示位数。
四、.运算符须要给与特别的注意,由于它是一个有效的数字字符
,会被优先识别为数字字面量的一部分
,而后才是对象属性访问运算符
。
// 无效语法
42.toFixed(3) // SyntaxError
// 下面的语法都有效
(42).toFixed(3) // 42.000
0.42.toFixed(3) // 0.420
42..toFixed(3) // 42.000
复制代码
五、二进制浮点数最大的问题(全部遵循IEEE754规范的语言都是如此)就是小数的精度不许。(例如0.1+0.2===0.3 等于false的经典问题)
// 判断两个小数相等
function numberCloseEnoughToEqual(n1,n2){
return Math.abs(n1-n2) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
numberCloseEnoughToEqual(a,b) // true
复制代码
六、可使用Number.isInteger()来检测一个值是不是整数。
Number.isInteger(42) // true
Number.isInteger(42.000) // true
Number.isInteger(42.3) // false
// polyfill
if(!Number.isInteger){
Number.isInteger = function(num){
return typeof num === 'number' && num % 1 == 0
}
}
复制代码
七、a | 0 能够将变量a中的数值转换为32位有符号整数,由于数位运算符|只适用于32位整数(它只关心32位之内的值,其余的数位将被忽略)。
八、undefined类型只有一个值,即undefined
。null类型也只有一个值,即null
。他们的名称既是类型也是值。undefined指从未赋值
,null只曾赋过值,可是目前没有值
九、null是一个特殊关键字
,不是标识符
,咱们不能将其当作变量来使用和赋值。然而undefined倒是一个标识符
,能够被看成变量来使用和赋值。
十、在非严格模式下,咱们能够为全局标识符undefined赋值
function foo(){
undefined = 2; // 很是糟糕的作法
}
foo();
function foo(){
"use strict";
undefined = 2; // TypeError
}
foo()
复制代码
十一、咱们能够经过void运算符
便可获得undefined。表达式void __ 没有返回值,所以返回结果是undefined。void并不改变表达式的结果
,只是让表达式不返回值
。一般咱们用void 0 来得到undefined。
var a = 42;
console.log(void a,a) // undefined 42
复制代码
十二、不是数字的数字(NaN)
数字
类型的var a = 2 / "foo"; // NaN
typeof a === 'number' // true
复制代码
// 全局函数isNaN判断。(可是有一个缺陷,就是当传递一个非数字的时候,isNaN也返回true)
var a = 2 / 'foo';
var b = 'foo';
window.isNaN(a) // true
window.isNaN(b) // true
// ES6 的Number.isNaN
if(!Number.isNaN){
Number.isNaN = function(n){
return (
typeof n === "number" &&
window.isNaN(n)
)
}
}
// 最简单的方法,NaN是Javascript中惟一一个不等于自身的值
if(!Number.isNaN){
Number.isNaN = function(){
return n !== n;
}
}
复制代码
1三、零值
负零
进行字符串化
会返回'0'var a = 0 / -3;
a; // -0
a.toString() // '0'
a+'' // '0'
String(a) // '0'
复制代码
字符串
转换为数字
,获得的结果是准确的。+"-0" // -0
Number("-0") // -0
JSON.parse("-0") // -0
复制代码
function isNegZero(n){
n = Number(n);
return (n===0) && (1/n===-Infinity)
}
复制代码
1四、ES6新加入了一个工具方法Object.is()
来判断两个值是否绝对相等(加入了NaN和-0的判断)
if(!Object.is){
Object.is = function(v1,v2) {
// 判断是否为-0
if(v1===0 && v2===0){
return 1/v1 === 1/v2
}
//判断是否为NaN
if(v1!==v1){
return v2!==v2;
}
// 其余状况
return v1 === v2;
}
}
复制代码