一共七种引用类型:git
两种访问对象属性的方法:web
一般建议使用点表示法
方括号表示方法主要优势: 经过变量来访问属性。数组
·[].length属性不是只读的,能够读取,修改,扩大/新增,缩小/删除。浏览器
经典问题: 检测对象是不是数组 arr instanceof Array?
本质依赖于构造函数,受到执行环境影响。因此,ES5当中是新增了Array.isArray(arr)方法。app
经典问题: 类型判别?
null是对象空指针,适合判断基本类型变量,不适合判断引用类型(都返回object),好比自定义的对象类型框架
若是有多个框架,那就存在两个以上不一样的全局执行环境,那就会有两个不一样版本的Array的构造函数。
并且返回的是true/falsedom
高效可是危险Null or Undefinedide
方法前面带*表示不修改原来数组函数
['Fire', 'Air', 'Water'].join('-')); //"Fire-Air-Water"
逆方法: String.prototype.split()this
var animals = ['ant', 'bison', 'camel', 'duck', 'elephant']; animals.slice(2);// Array ["camel", "duck", "elephant"] animals.slice(2, 4);//Array ["camel", "duck"] animals.slice(-2, -1) <==> animals.slice(3, 4) //前提条件:长度为5
arr1.concat(arr2)
months.splice(1, 0, 'Feb'); // inserts at index 1 months.splice(4, 1, 'May'); // replaces 1 element at index 4
[0,1,5,10,15].sort(); //[0,1,10,15,5] [0,1,5,10,15].sort( (v1,v2) => { return (v1<=v2)? -1:1; }); //[0,1,5,10,15]
toLocalString()
var start = Date.now(); // do something var end = Date.now(); costTime = stop -start;
var pattern = /[bc]at/gi <==> new RegExp("[bc]at","gi"); //大小写不敏感,全局匹配bat或者cat var matches = pattern.exec("bat is not a cat");
函数名仅仅是指向函数的指针,不会与某个函数绑定(即变量法的函数引用是能够被覆盖的)
注意函数声明提高(function declaratioin hoisting)和变量提高是有区别的。
//unexpected identifier alert(sum(1,1)); var sum = function(v1, v2){ return v1 + v2; } //ok alert(sum1(1,1)); function sum1(v1, v2){ return v1 + v2; }
严格模式下arguments.callee和arguments.caller无效
注意做用域
window.color = "red"; var o = { color : "blue"}; function sayColor(){ alert(this.color); } sayColor(); //red o.sayColor() = sayColor(); o.sayColor(); //blue
fn.length属性表示fn但愿接收的参数的个数
prototype属性
保存全部实例方法的真正所在,换言之甚至toString(),valueOf()等方法都在prototype之下。
在建立自定义引用类型以及实现继承时,prototype极为重要。而且它是不可枚举的,所以for-in没法发现。
内部方法
每一个fn都包含apply()和call(),apply()固定接收两个参数,做用域和arguments, call()接收多个参数,第一个是做用域。
这两个函数能够用来传参数,可是真正的做用是扩充做用域:如此对象和方法不须要有任何的耦合关系
window.color = "red"; var o = { color : "blue"}; function sayColor(){ alert(this.color); } sayColor.call(this); //red sayColor.call(window); //red sayColor.call(o); //blue
咱们知道,基本类型值不是对象,所以逻辑上应该是没有方法的。可是实际当中Boolean, Number, String这三种在访问/读取的时候,会进入一种“读取模式”:建立实例 =》实例上调用方法 =》销毁实例
这种读取模式是隐性的,而且不建议显示调用。由于会让人分不清是在处理基本类型仍是引用类型。
直接调用基本包装类型的构造函数,返回实例都属于object
var value = Number("25"); alert(typeof value);// number var value2 = new Number("25"); alert(typeof value2);// object
new Object()这个构造函数是会根据参数返回相应的基本包装类型的实例。说白了就是工厂模式呗
var obj = new Object("test"); alert(obj instanceof String) //true
很烂很烂很烂,不要去用
num.toFixed(2); //精确两位小数 num.toExponential(2) //科学计数法保留两位小数 num.toPrecision(2) //看哪一种格式方便,自动返回fixed仍是指数形式
模式匹配方法: str.match(pattern); str.replace(), str.split(),str.includes()
var mathces = pattern.exec(str) <==> str.match(pattern); var str = "cat,bat,fat"; //pattern必定要用全局模式g alert( str.replace(/(.at)/g, "word ($1)") ); //word (cat), word (bat), word (fat)
padding方法: str.padStart(), str.padEnd();
const fullNumber = '2034399002125581'; const last4Digits = fullNumber.slice(-4); const maskedNumber = last4Digits.padStart(fullNumber.length, '*'); //"************5581"
由ECMAScript实现提供的、不依赖于宿主环境的对象。
//http://www.w3school.com.cn/My%20first/ encodeURI("http://www.w3school.com.cn/My first/") // http%3A%2F%2Fwww.w3school.com.cn%2FMy%20first%2F encodeURIComponent("http://www.w3school.com.cn/My first/"
var msg = "hello world"; eval("alert(msg)");
Math.E常量e,Math.PI常量圆周率
// 这个技巧的关键是把Math对象做为第一个参数,从而正确地设置this指针,而后吧values数组做为参数 var values = [1,2,3,4,5]; var max = Math.max.apply(Math, values);
Math.ceil(); // 向上取整 Math.floor(); // 向下取整 Math.round(); // 四舍五入整数
本质是返回(0,1)的一个随机数
值 = Math.floor( Math.random() * 可能值的总数 + 第一个可能的值 );
Math.abs(num); Math.pow(num,power); //num^power 三角函数、反三角函数等