instanceof,在只有一个全局执行环境时有效,如果网页包含多个框架,那实际上存在多个全局执行环境时,判断不准确。
Array.isArray(),克服了instanceof的问题。不过要在ie9+以上才能用。因此存在浏览器兼容问题
Object.prototype.toString.call(arr) === ‘[object Array]’; 可以写下面函数,直接给 Array 对象添加一个方法 isArray 方法。
(function(){
if(!Array.isArray){
Array.isArray = function(arr){
return Object.prototype.toString.call(arr) === '[object Array]';
}
}
})();
常用的两个将字符串转数字的方法 Number() 与 parseInt() 区别
Number(),这个方法,是将一个字符串数或 true,false,null 转换成数字,其它转成 NaN。
parseInt(),把一个字符串转换成整数的函数。遇到非数字时,停止解析。有数返回数,没数返回NaN,解析数字时,还会默认根据数字前面的符号转换进制。例如 ‘08’ 就会根据前面的 0 转换成八进制,又因八进制中没有数字 8,就会解析成 0。因此在用这个方法的时候,最好添加上进制。例如:parseInt(‘08’, 10);就会根据 10 进制来转换。
判断一个值是否可用作数字的最佳方法是使用 isFinite() 函数。它会筛选掉 NaN 和 Infinity,isFinite() 也会像 Number() 一样试图把一个运算数转换为一个数字。
var arr = [1,[2,3],[[4,5],6],7];//把数组变成一维数组
console.log(arr.toString().split(',').map(function(x){
return Number(x);
}));//返回[1,2,3,4,5,6,7]
console.log(arr.toString().split(',').map(function(x){
alert(x);
}));//分别弹出1,2,3,4,5,6,7,最后返回[undefined,undefined.....]7项
//因为map()方法返回的是一个数组,方便做链式操作。
注:map(),filter(),forEach() 不能中断遍历;如果需要中断,可以灵活运用 some() ,或用 for 循环
对象的比较都是引用的比较,因此,在比较对象的属性和值是否全等时,不能直接比较。通常要用 JSON.stirngify() 转为字符串后,再比较字符串。
var arr1 = [1,2],arr2 = [1,2];
console.log(arr1 === arr2);//false
console.log(JSON.stirngify(arr1) === JSON.stirngify(arr2));//true
var a = {}, b = {}, c = {};//a、b、c每个都引用一个不同的空对象
a = b = c = {};或c = {}; b = c; a = b; //a、b、c都引用同一个空对象
数据属性有四个描述其行为的特性:
要修改属性的默认特性的值,必须使用 Object.defineProperty() 或 Object.defineProperties() 方法修改(一个或多个特性)。这个方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象。 而由Object.defineProperty() 或 Object.defineProperties() 创建的特性,默认值都为 false。
var person = {
name:'wang',
age:18
};
Object.defineProperty(person,'name',{
writable:false;
});
person.name = 'li';
alert(person.name);//wang
访问器属性不包含数据值,它们包含一对 getter 和 setter 函数(不过,这两个函数也不是必须的)。 访问器属性有四个特性:
注:访问器中没有 Writable 和 Value 这两个特性,因此不要设置这两个的值,否则出错。
var book = {
_year : 2004,
edition : 1
};
Object.defineProperty(book,"year",{
get : function () {
alert(this._year);
},
set : function (newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year; // 弹出窗口,显示 2004
book.year = 2005;
console.log(book.edition); // 2
专门读取数据属性和访问器属性的特性的值的方法: Object.getOwnPropertyDescriptor(),这个方法接收两个参数,属性所在的对象和属性名称。
var girl = {name: "zyj"};
console.log(Object.getOwnPropertyDescriptor(girl,"name"));
// Object {value: "zyj", writable: true, enumerable: true, configurable: true}
Object.defineProperties(girl,{
name:{
writable: false
},
age:{
writable: true,
value: 22
}
});
console.log(Object.getOwnPropertyDescriptor(girl,"name"));
// Object {value: "zyj", writable: false, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(girl,"age"));
// Object {value: 22, writable: true, enumerable: false, configurable: false}
var descriptor = Object.getOwnPropertyDescriptor(girl,"age");
console.log(descriptor.value); // 22
console.log(descriptor.configurable); // false
console.log(descriptor.writable); // true
console.log(descriptor.get); // undefined
console.log(descriptor.set); // undefined
首先,this 的指向在函数定义的时候是确定不了的,只有在函数调用的时候才能确定 this 到底指向谁。概括来说就是 this 指向调用它的对象。(ES6 中的箭头函数例外,箭头函数中没有 this,因此箭头函数内部的 this 实际上就是它所在的环境中的 this) 。
//函数直接调用时
window.name = 'Global';
function sayName() {
return this.name;
}
console.log(sayName());//Global
var count = {
name:'count',
timer:function () {
setTimeout(function () {
console.log( this.name );//GLobal
},1000);
}
};
count.timer();
//函数作为对象的方法调用时
var obj = {
name:'obj',
sayName:sayName
}
console.log(obj.sayName());//obj
//通过call,apply调用函数时
var car = {
name:'法拉利'
};
console.log(obj.sayName.call(car));//法拉利
//构造函数调用时
function Cat(name,age) {
this.name = name;
this.age = age;
}
var cat1 = new Cat('叮当',2);//this 指向新创建的实例
//ES6 箭头函数中的 this
window.name = 'Global';
const fun = function(){
setTimeout( function(){
console.log(this.name)
},1000)
}
const funArrow = function(){
setTimeout( () => console.log(this.name),1000);
}
fun.call({name:'call'});//Global
funArrow.call({name:'call'});//call
JavaScript 有 6 种数据类型。其中 5 基本数据类型,1 种引用类型。
基本数据类型:number、string、boolean、undefined、null
引用类型:object
后面列出的值会被当作假:false、null、undefined、空字符串’‘、0、数字NaN。其他所有值都被当作真。
在做相等比较时,最好只用 === 和 !==
调用函数时,应该提供的参数没有提供,该参数等于 undefined。
str.charAt(index):返回 str 中下标为 index 的字符,如果 index 超出范围,则返回 ''
str.charCodeAt(index):返回 str 对应下标的字符的 unicode 编码数字。
String.fromCharCode(num):返回对应 unicode 编码数字 num 的字符。
###截取字符串片段
JSON.parse() 方法用于从一个 JSON 格式字符串解析出 javascript 类型的数据。
语法:JSON.parse(text[, reviver])
text: 必需, 一个有效的 JSON 字符串。
reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。
JSON 属性名称必须用双引号包裹;最后一个属性后面不能有逗号。
若被解析的 JSON 字符串是非法的,则会抛出 一个语法错误异常。
JSON.parse() 不允许用逗号作为结尾。
JSON.parse('{}'); // {}
JSON.parse('true'); // true
JSON.parse('"foo"'); // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null'); // null
JSON.parse('{name:tom}'); //Unexpected token
JSON.parse('{name:"tom"}'); //Unexpected token
JSON.parse('{"name":tom}'); //Unexpected token
JSON.parse('{"age":undefined}');//Unexpected token
JSON.parse('{"name":"tom"}'); //{name: "tom"}
JSON.parse('{"age":10}'); //{age: 10}
JSON.parse('{"age":null}'); //{age: null}
var str='{"p": 5}';
JSON.parse(str, function (k, v) {
if(k === '') return v; // 如果到了最顶层,则直接返回属性值,
return v * 2; // 否则将属性值变为原来的 2 倍。
}); // { p: 10 }
JSON.stringify() 方法用于将一个 javascript 类型的数据转换成 JSON 格式字符串
语法:JSON.stringify(value[, replacer [, space]])
value:一个有效的javascript值。 replace:(可选)
如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;
如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;
如果该参数为null或者未提供,则对象所有的属性都会被序列化;
space:(可选)
如果参数是个数字,它代表有多少的空格;上限为 10。改值若小于 1,则意味着没有空格;
如果该参数没有提供(或者为null)将没有空格;
DOM(Document Object Model):文档对象模型。就是将 XML(或者 HTML)内的节点定义成基本统一的对象数据可以供程序语言(如 javaScript)控制的技术规范。
程序语言不是直接访问 XML(或者 HTML)文档的,而是先由 XML(或者 HTML)分析器对文档进行分析,然后,应用程序通过 XML(或者 HTML)分析器所提供的 DOM 接口或 SAX 接口对分析结果进行操作,从而间接地实现了对 XML(或者 HTML)文档的访问。