这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战
1,JS基础
1:原始值:存储在 stack 中
Number String Boolean undefind null
2:引用值:存储在 heap 中
array object function date regExp
3:逻辑运算符 && || !
// undefined ,null, NaN ,"" ,0, false => false
var a = 1 && 2;
先看第一个表达式转换成布尔值的结果,如果结果为真,那么它会看第二个表达式转换成为布尔值的结果,
如果第一个结果为false,直接返回第一个表达式的值
4: typeof 返回值六种
number string boolean object undefind function
其中 typeof(null) == object
typeof(undefind) == undefind
5: 类型转换
number(null)= 0;
isNaN(null) == false isNaN(undefind) == false
隐式类型装换:Number
+-x%/ 除了加号,都要隐式转换 Number()
NaN!= NaN
undefined == null
2, JS 继承
1:借用构造函数
2:共享原型
Son.prototype = Father.prototype;
3: 圣杯模式:最完美的继承模式
function inherit(Target,Origin){
function F(){};
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.constructor = Target;
Target.prototype.uber = Origin.prototype;
}
3, 数组
1>,push(),数组末尾添加数据
/*覆盖系统push方法*/
var arr=[1,2];
Array.prototype.push = function (){
for(var i=0;i<arguments.length;i++){
this[this.length] = arguments[i];
}
return this.length;
}
2>,pop(),把数组的最后一位剪切出来
3>,unshift(),在数组前面添加元素
4>,shift()
5>,splice()分割 arr.splice(从第几位开始,截取多少的长度,在切口处添加新的数据)
splice()还可以添加元素,splice(3,0,4)从第三位开始截取,截0个,在切口处添加元素4
6>,sort()排序
arr = [1,3,4,0,9,-1,10];
/*sort方法可以带参数,匿名函数
函数必须写两个参数, 看返回值, 大于0,正序,小于0,倒序
* */
arr.sort(function(a,b){
return a-b; //正序
});
arr.sort(function(a,b){
return b-a;//倒序
});
/*给一个有序的数组乱序*/
arr.sort(function(){
return Math.random()- 0.5;
});
对象按照年龄大小排序
var arr=[cheng,deng,zhang];
arr.sort(function(a,b){
a.age -b.age;
});
var arr = ['ab郑黎明的加上','afad','ccccc','adfadfadfada']
/*按照字符排序*/
arr.sort(function(a,b){return a.length-b.length;});
/*按照字节排序*/
function retBytes(str){
var num = str.length;
for(var i=0;i<str.length;i++){
if(str[i].charCodeAt()>255){
num++;
}
}
return num;
}
arr.sort(function(a,b){
return retBytes(a)-retBytes(b);
});
8>:类数组 例如:arguments
var obj={
"0":'a',
"1":'b',
"2":'c',
"length":3,
"push":Array.prototype.push,
"splice":Array.prototype.splice
}
//属性要为索引数字属性,必须要有length属性,最好加上push
9>: /typeof函数实现原理/
/*分两类,原始值和应用值*/
function myType(target){
var template = {
"[object Array]" : "array",
"[object Object]": "object",
"[object Number]": "number - object",
"[object Boolean]":"boolean - object",
"[object String]" :"String - object"
}
if(target == null){
return "null";
}
if(typeof(target) == 'function'){
return 'function';
}else if(typeof(target) == 'object'){//数组,对象,和包装类
var str = Object.prototype.toString().call(target);
return template[str];
}else{
return typeof(target);
}
}
10>:/数组去重/
Array.prototype.unique = function(){
var temp = {};
var arr = [];
var len = this.length;
for(var i=0;i< len;i++){
if(!temp[this[i]]){
temp[this[i]] = 'abc';
arr.push(this[i])
}
}
return arr;
}
4, 立即执行函数
1:针对初始化功能的函数:
(function(){
}())
这个就是立即执行函数,执行完之后,立即被释放,再也找不到了
或者:(function(){})()
5, 预编译
(1)函数声明整体提升
(2)变量声明提示
imply global
如果一个变量未经定义就赋值了,就归window所有了
一切声明的全局变量,都是window的属性
window就是全局的域
var a=1;
var b=2;
var c =3;
window {
a:1,
b:2,
c:3
}
预编译发生在函数执行的前一刻
预编译过程:
首选创建一个AO对象,比如:AO{};
第二部:把形参和变量声明当做AO对象的属性 并赋值undefind
第三部:并把实参值和形参赋值相统一
第四部:在函数体内找函数体,赋值给函数变量
第五步:开始执行
functoin test(){
console.log(a);
var b = 1234;
a = 123;
function a(){};
var a;
b = 123445;
var b= function (){}
console.log(a);
}
test(1);
注意解题四部曲
预编译: AO{
a: undefined;
a : undefined;
};
AO{
a:1;
b:undefined;
}
第四部:AO{
找函数体赋值
}
6, Arguments
- arguments对象的长度等于传递给函数的参数的数量。
- arguments对象是类似数组的对象,但不是JavaScript数组。
- 你不能对arguments对象使用其他JavaScript数组方法,例如push,pop,slice等等。
- JavaScript arguments对象索引从零开始。所以第一个参数将被arguments[0]引用,第二个参数将被arguments[1]引用
对象转换成数组
ES5: Array.prototype.slice.call(arguments)
ES6: Array.tofrom(arguments)