js基础总结

基础

普通---当即执行
async---异步加载,当即执行,不按照顺序执行
defer---异步加载,最后执行
<noscript>

数据类型json

number
    NaN---未知的数值 经过inNaN(判断是否能转化为数值)来判断
    infinity
    指数形式:aE+n a乘10的n次方,11E-3 ===> 11*10^-3 = 0.011
undefined---未定义
null---空对象指针
string
boolean
object
typeof操做符:undefined boolead string number object(null) function
基本转义字符 \n换行,\b空格

控制结构windows

1.do-while
先执行,再判断
2.while
判断再执行
3.for
---都是为假就跳出循环
4.for-in-迭代读取对象的key,可能不会按照顺序读取...
5.label,break,continue
6.with---将代码的做用域设定到特定对象中
with(a){
    var x=b;
    var y=c;
}---将做用域设定到a对象中;
等同于
var x=a.b;
var y=a.c;
7.switch
    case x : 语句;break;
    default: 语句;

变量,做用域和内存数组

变量类型:
基本类型---简单数据段
引用类型---对象类
1.对于直接赋值 a=b
基本类型传递值
引用类型传递指针,因此改变b,a会改变;
2.对于向函数传递参数
都是传递值;

执行环境及做用域
function  a(){
    function b(){
    }
}
环境栈: ↓
        b的环境对象---活动对象,包括arguments变量
        a的环境对象---第二级做用域
        window---全局做用域

引用类型浏览器

经过new或者字面量的形式建立
公共方法:
    tostring()
    tolocalstring()
    valueof()
引用类型包括如下几类:
1.object
2.array
3.date
    得到时间
     var now = new Date;
     而后经过getTime()等方法
    建立时间
     var dateTime = new Date("2016/05/20 23:42:00");
4.RegExp
5.Function
6.包装类型-boolean,string,number
---
var a='xx';
var b=a.length; b=2;
至关于:
var a='xx';
a1=new string('xx');
b=a1.length;
a1=null;
基本数据类型能使用方法,是由于转换成了这些包装类型,而后当即被释放;
a.color='red';---a变成包装类型string,添加属性color,而后被释放
alert(a.color);---undefined,又变成了基本类型.
---
var value='1';
Number(value);---转换函数,转成数值
new Number(value);---构造函数,构造了一个包装类型
7.单体内置对象
Global
    全局对象---最底层的对象---没有直接调用的方法,只有经过window对象调用
    window对象是Global(js语法中的最底层对象)与浏览器对象之和;
Math

面向对象

对于一个属性--由一个name,6个特性组成;
可配置性 configurable ---可否delete删除;可否修改特效;可否设置为访问器属性;
可枚举性 enumerable---可否for-in
数据属性:
可修改性 writable
数值 value---默认undefined
访问器属性:(es5标准,ie8及如下没有--主要 适用与移动端);
set
get

前三个特性,默认true,可是若是开始设置,任意一个特性,其他的默认false;   
数据属性和访问器属性不能混用;

var a = {};
Object.defineProperty(a,"name",{
    value:"lh",
    writable:false          --- 这个时候,其他两个属性设置为了false;
})
var b = Object.getOwnPropertyDescriptor(a,"name");
获得特性名=>值组成的对象;

Object.defineProperty(a,"name",{
    set:function(e){
        this.name=e+1;
    }
设置多个属性
Object.defineProperties(a,{
    name:{},
    vale:{}
})

Object模式  
var x = new Object()
x.name='';
...

对象字面量
var x = {
    name:'',
    ...
    }
    
工厂模式
function x (){
    var o = new Object();
    o.name='';
    ...;
    return o;
}

构造函数
function x(){
    this.name='';
    }
var y =new x (); 

除了构造函数,这几种方法原型链都是
对象--对象原型(Object.prototype)--null
构造函数是
实例化的对象(y)--实例原型(y.__proto__/x.prototype)--对象原型(Object.prototype)--null


function a(){
    this.fn=function(){}
}---构造函数a中建立一个方法fn;
var b1 = new a();
var b2 = new a();
这个时候 b1.fn并不等于b2.fn;
要他们共用一个方法,要将方法放在原型a上;
a.prototype.fn = function(){...};

----------------------------------------
实际使用:
function student(){
    this.name=prop.name||"匿名";
};
student.prototype.fn=function(){...};
function createstudent(prop){
    return new student(prop||{});
}
---而后直接用 var xiaoming = createstudent();来建立
1.不要new
2.传参数不用管顺序,和有没有,还能设置默认值...
3.彻底匹配json数据;
var x = createstudent({
    "name":"xiaoming",
    ...
}) 

function mor(obj) {
    var rs = [];
    while(obj) {
       rs.push(obj);
       obj = Object.getPrototypeOf(obj);
    } 
    return rs;
}




原型上的变量,实例中赋值后,变成不继承了??--继承,可是优先级不一样
q.hasOwnProperty("vv") true
w.hasOwnProperty("vv") flase  --
在q中添加了vv属性,由于调用是从上至下的,因此如今实例中查找,再去原型--
能够经过delete q.vv;而后调用的又是原型中的了.

function empty(){};??
                            实例a                    构造函数b                   原型c  
---------------------------------------------------------------------------------------------

constructor                  b                  functon Function(){}                 b
-----------------------------------------------------------------------------------------------

prototype                   undefine                    c                        undefine
-----------------------------------------------------------------------------------------------

__proto__                       c               function Empty(){}               Object
-----------------------------------------------------------------------------------------------
__proto__才是原型,继承.
定义函数时,就会有construct和prototype出现
    函数的原型是个空对象,继承自Object;
    new的做用是将this绑定?
------------------------------------------------------------------------------------------------


构造函数模式+原型模式实际运用
var prop = {
    name:"gou",
    cat:"miao"
}

function a(){
    this.cat=prop.cat||'mao' 
};
a.prototype={
    constructor:a,
    创建对象的时候,设置原型的时候.只能单个设置
eg:
    a.prototype.name:'="name',
    say:function(){
        return this.say+this.name;
    }
}

function createA(){
    return new a (prop||{})
}

var b = createA(prop);

稳妥构造模式
function a (){
    var o = new Object();
    name="xx";
    o.sayname=function(){
        alert(name);
    }
    return o;
}
适应在须要安全的地方--除了o.sayname方法,没法访问内部属性;

函数

闭包:
能访问函数内部.
匿名函数的返回---
            function a(x){
                var t='he';
                console.info(x);                        
                return function (x){
                console.info(t,x,this);
                }
            }
        var b=a('he');---'he',b=function(){...};this指向windows,可是环境仍然为a;
        能访问到t,x又做为匿名函数的参数了,因此如b不赋值,则为undefined;
        b('he');---'he,he,window';
严格模式下,不能使用arguments.callee;
var a = (function b(){})---用来内部调用本身;
闭包用途:
function a(){
    var x=1;
    add=function(t){
        x=x+t;
        console.info(x);
    };
    return function b(){
        x++;
    console.info(x);
    };

}
var b=a();
b();2
b();3
add(1);5

---经过闭包,b函数赋予给全局变量b,b函数又依赖a,因此将a环境一直保存在内存中了...
add没用var建立,因此是个能访问a内部的全局函数,能够用来设置a内的变量;

其余

错误处理

因此抛出的错误都是error对象的实例
error对象:
    message:错误提示信息
    name:错误名称(非标准属性)
    stack:错误的堆栈(非标准属性)
派生的六种对象
1.syntaxError---语法错误
2.refrenceError---引用了不存在的变量
3.rangeError---超出范围
4.typeError---使用变量或参数不是预期类型
5.URIError---URI相关函数的参数不正确
6.EvalError---Eval函数没有正确执行
自定义错误:
function a(){}
a.prototype=new Error;
a.contructor=a;
var b=new a;

throw语法
throw抛出一个对象,而后中断
try{}
catch(){}
finally{}
执行try中的语句,若是完成,执行finally语句
若是错误,catch捕获错误(不抛出错误),而后执行catch语句,再finally语句

经常使用操做符与方法汇总

```
操做符
typeof---主要检测基本类型
instanceof---主要检测引用类型 检测对象的cunstructor
1.Object
实例 instanceof 原型
Object.getPrototypeOf() 得到对象的原型
Object.constructor 对象的构造函数
Object.hasOwnProperty( ) 检查属性是否被继承
Object.isPrototypeOf(a) 一个对象是不是另外一个对象的原型 (a原型链上是否有Object);
Object.propertyIsEnumerable( ) 是否能够经过for/in循环看到属性
Object.toLocaleString( ) 返回对象的本地字符串表示
Object.toString( ) 定义一个对象的字符串表示
Object.valueOf( ) 指定对象的原始值
2.Array
Array.concat( ) 链接数组
Array.join( ) 将数组元素链接起来以构建一个字符串
Array.length 数组的大小
Array.pop( ) 删除并返回数组的最后一个元素
Array.push( ) 给数组添加元素
Array.reverse( ) 颠倒数组中元素的顺序
Array.shift( ) 将元素移出数组
Array.slice( ) 返回数组的一部分
Array.sort( ) 对数组元素进行排序
Array.splice( ) 插入、删除或替换数组的元素
Array.toLocaleString( ) 把数组转换成局部字符串
Array.toString( ) 将数组转换成一个字符串
Array.unshift( ) 在数组头部插入一个元素
Array.安全

3.Boolean
Boolean.toString( ) 将布尔值转换成字符串
Boolean.valueOf( ) Boolean对象的布尔值
4.Function
Function.apply( ) 将函数做为一个对象的方法调用
Function.arguments[] 传递给函数的参数
Function.call( ) 将函数做为对象的方法调用
Function.caller 调用当前函数的函数
Function.length 已声明的参数的个数
Function.prototype 对象类的原型
Function.toString( ) 把函数转换成字符串
5.Number
Number.MAX_VALUE 最大数值
Number.MIN_VALUE 最小数值
Number.NaN 特殊的非数字值
Number.toLocaleString( ) 把数字转换成本地格式的字符串
Number.toPrecision( ) 格式化数字的有效位
Number.toString( ) 将—个数字转换成字符串
Number.valueOf( ) 返回原始数值
6.String(字符串对象)
String.charAt( ) 返回字符串中的第n个字符
String.charCodeAt( ) 返回字符串中的第n个字符的代码
String.concat( ) 链接字符串
String.indexOf( ) 检索字符串
String.lastIndexOf( ) 从后向前检索一个字符串
String.length 字符串的长度
String.localeCompare( ) 用本地特定的顺序来比较两个字符串
String.slice( ) 抽取一个子串
String.split( ) 将字符串分割成字符串数组
String.substr( ) 抽取一个子串
String.substring( ) 返回字符串的一个子串
String.toLocaleLowerCase( ) 把字符串转换小写
String.toLocaleUpperCase( ) 将字符串转换成大写
String.toLowerCase( ) 将字符串转换成小写
String.toString( ) 返回字符串
String.toUpperCase( ) 将字符串转换成大写
String.valueOf( ) 返回字符串
7.其余
parseInt(x,16/10/8) --- 若是x=08 有没有指定radix 那就会输出8进制
parseFloat(x,16/10/8)
isNaN()
isFinite() 检测是否是infinity与NaN
escape() 对整个字符串进行转义 (% ? 等在url中有意义的也会被转义)
encodeURI() 对URL进行转义(只会对参数) --- decode...反转义
encodeURIComponent() 对整个url转义(当url做为参数时,如跳转)闭包

相关文章
相关标签/搜索