1 javascript中的数据类型
string、number、boolean、null、undefined、object、function(object的子类型)
1.1 数据类型疑惑点整理
- 在对变量执行 typeof 操作时,得到的结果并不是该变量的类型,而是该变量持有的值的类 型,因为 JavaScript中的变量没有类型,只有值才有。变量可以随时持有任何类型的值。
var a = 42;
typeof a; // "number"
a = true;
typeof a; // "boolean"
- null 是基本类型中唯一的一个“假值”(falsy 或者 false-like)类型,typeof 对它的返回值为 “object”。
//可以用以下方式准确判断 null类型
var a = null;
(!a && typeof a === "object"); // true
- typeof 运算符总是会返回一个字符串:
//typeof 42 首先返回字符串 "number",然后 typeof "number" 返回 "string"。
typeof typeof 42; // "string"
- undefined 和 undeclared
已在作用域中声明但还没有赋值的变量,是 undefined 的。相反,还没有在作用域中声明
过的变量,是 undeclared 的。
//"is not defined"和"undefined"是两码事!!!
var a;
a; // undefined
typeof b; // "undefined" 无异常,代码可以继续执行
b; // ReferenceError: b is not defined
//RHS查询会直接抛出异常,后续代码无法继续执行
由typeof引申的安全机制:
由于typeof对于undefined的变量和undeclared的变量返回值都是undefined,故可以用typeof来规避异常。
//假设DEBUG是一个有可能不声明的全局变量
// 这样会抛出错误
if (DEBUG) {
console.log( "Debugging is starting" );
}
// 这样是安全的
if (typeof DEBUG!== "undefined") {
console.log( "Debugging is starting" );
}
//也可以用全局变量判断,因为对象中的未声明类型会是undefined,不报错
if (window.DEBUG) {
// ..
}
//还有依赖注入模式规避异常
function doSomethingCool(FeatureXYZ) {
//LHS查询在非严格模式下未声明变量会创建全局变量
var helper = FeatureXYZ || function() { /*.. default feature ..*/ };
var val = helper();
// ..
}
2 数组
2.1 数组疑惑点整理
- 跨下标加入数组
var a = [ ];
a[0] = 1;
// 此处没有设置a[1]单元
a[2] = [ 3 ];
a[1]; // undefined
a.length; // 3 a[1]也占据了空间了
- slice()
arrayObject.slice(start,end) : slice() 方法可从已有的数组中返回选定的元素。
start 规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
end 规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
无入参形式 slice() 返回该数组的一个数组复本
var arr = new Array();
arr[0] = "George";
arr[1] = "John";
arr[2] = "Thomas";
arr[3] = "James";
console.log(arr.slice(2,3));//["Thomas"]
console.log(arr.slice(1));//["John","Thomas","James"]
//slice() 返回参数列表的一个数组复本
function foo() {//转换数组并添加元素
var arr = Array.prototype.slice.call( arguments );//arguments 函数的入参
arr.push( "bam" );
console.log( arr );
}
foo( "bar", "baz" ); // ["bar","baz","bam"]
//ES6可替代上述方式
var arr = Array.from( arguments );
- 字符串与字符数组
var a = "foo";
var b = ["f","o","o"];
a.length; // 3
b.length; // 3
a.indexOf( "o" ); // 1
b.indexOf( "o" ); // 1
var c = a.concat( "bar" ); // "foobar"
var d = b.concat( ["b","a","r"] ); // ["f","o","o","b","a","r"]
a === c; // false
b === d; // false
a; // "foo"
b; // ["f","o","o"]
a[1] = "O";//并未修改a
b[1] = "O";
a; // "foo"
b; // ["f","O","o"]
/*注:a[1] 在 JavaScript 中并非总是合法语法,在老版本的 IE 中就不被允许(现在可以了)。
正确的方法应该是 a.charAt(1)。*/
//反转字符串
var d = a
// 将a的值转换为字符数组
.split( "" )
// 将数组中的字符进行倒转,Array的方法
.reverse()
// 将数组中的字符拼接回字符串,Array的方法
.join( "" );
d; // "oof"