首页 > 代码库 > baseline.js

baseline.js

1:throw new TypeError("test");

2:var list=Object(this)

3:var len = list.length >>> 0;

一:

(function(win){    ...    window.bs_patch = (function(){ .... })();
var patch = window.bs_patch;
window.bs_patches = function(impl,obj){}; var patches=
windows.bs_patches;
patches({ ..of,isArray.. },Array); patches({ ..entries,every,fill,fliter,find,findIndex,keys,forEach,copyWithin,indexOf,lastIndexOf,map,reduce,reduceRight,some.. },Array.prototype); patch((function(){ ..unshift.. })(),Array.prototype,
"unshift",isIE68); patch((function(){ ..join.. })(),Array.prototype,"join",isIE68); patches({ ..now.. },Date); patch((function(){ .... })(),Date,parse,isIE); patches({ .... },Date.prototype); patch(function(oThis){ .... },Function.prototype,bind); patch(function(argv){ .._Iterator.. },window,"Iterator"); patch({},window,JSON); patches({},window.JSON); patch((function(){ .._Map.. })(),window,Map); patches({ ..delete,clear,entries,forEach,get,has,keys,set,values.. },Map.prototype); patches({ ..acosh,asinh,atanh,cbrt,clz32,cosh,expml,fround,hypot,imul,log10,log1p,log2,sign,sinh,tanh,trunc.. },Math); patches({..epsilon,MAX_VALUE,MIN_VALUE,MAX_SAFE_VALUE,MIN_SAFE_VALUE,NEGATIVE_INFINITY,POSITIVE_INFINITY,"NaN",isFInite,isInteger,isNaA,parseFloat,parseInt,toInteger..},Number); patches({ ..setPrototypeOf,is,create,getOwnPropertyNames,getPrototypeOf.. },Object); patch((function(){ .... })(),Object,keys); patch((function(){ .._Proxy.. })(),window,Proxy); patch((function(){ .._Set,patches({ ..delete,clear,entries,forEach,has,add,values..}),_Set.prototype.. })(),window,Set); patches({ ..codePointAt,contains,endsWith,repeat,startsWith,trim,trimLeft,trimRight.. },String.prototype); patches({ ..fromCodePoint.. },String); patch(function(){ .._Promise(deferred,resolve,reject,all,race,).. }(),window,Promise);})(window);})

1.(function(){})()

    1.1:匿名执行函数,()的优先级最高,相当于var x=function(){},x();

    1.2: Object.defineProperty

YY = YY || {};// 定义全局变量,然后在里面加方法(function(){    YY.Lang = function(){       isUndefined:function(o){ return typeof o === ‘undefuned‘ },       isString:function(o){ return typeof o === ‘string‘ }    }            })();
alert(YY.Lang.isString(‘test me‘));

  1.3:(function(){ var a=2;alert(a); })()和var a=2;alert(a);的区别是前者调用完之后a会释放空间,而后者不会。

二:

window.bs_patch = (function() {        // IE8 window.hasOwnProperty        window.hasOwnProperty = window.hasOwnProperty || Object.prototype.hasOwnProperty;        if(Object.defineProperty && !isIE68) {               return function(impl, obj, method, condition) {                if((method && typeof obj[method] == "undefined") || condition) {                    Object.defineProperty(obj, method, {  //IE678提示找不到defineProperty方法                        enumerable: false,                        configurable: true,                        writable: false,                        value: impl                    });                }            };        }else {            return function(impl, obj, method, condition) {                if((method && typeof obj[method] == "undefined") || condition) {                    obj[method] = impl;                }            };        }    })();

  var patch = window.bs_patch;

  window.bs_patches = function(impl, obj) {
  for(var key in impl) {
    if(impl !== window && impl.hasOwnProperty(key)) {
      patch(impl[key], obj, key);
    }
  }
  }
  var patches = window.bs_patches;

 2.1: Object.defineProperty 

 var o = window; // IE8下window可以打印出来,如果是{}则打印不出来 Object.defineProperty(o,abc,{value:123}); alert(o.abc);

    2.1.1 :Object.defineProperty(object, propertyname, descriptor)

    2.1.2:Internet Explorer 9 标准模式和 Internet Explorer 10 标准模式以及 Windows 应用商店 应用程序都支持所有功能。

    2.1.3:Internet Explorer 8 标准模式 支持 DOM 对象,()但不支持用户定义的对象。 可以指定 enumerable 和 configurable 特性,但不使用它们。 

          2.1.4:    value:属性的值
                writable:如果为false,属性的值就不能被重写。
              get: 一旦目标属性被访问就会调回此方法,并将此方法的运算结果返回用户。
              set:一旦目标属性被赋值,就会调回此方法。
                           configurable:如果为false,则任何尝试删除目标属性或修改属性以下特性(writable, configurable, enumerable)的行为将被无效化。
                           enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。

  

2.2:window.hasOwnProperty = window.hasOwnProperty || Object.prototype.hasOwnProperty; 

function A(name){
this.name=name; this.showAge=function(){};}A.prototype.showName = function(){ alert(this.name);}var B=new A("yuyu");alert(B.hasOwnProperty("showAge")); // truealert(B.hasOwnProperty("showName")); // false
alert(A.hasOwnProperty("showAge")); // false
alert(A.hasOwnProperty("name")); // truealert(A.prototype.hasOwnProperty("showAge")); //falsealert(A.prototype.hasOwnProperty("showName")); //truealert(A.prototype.isPrototypeOf(B)); //true
alert(B.prototype.hasOwnProperty("showName")); // 会报错,只有原型有prototype属性

  2.3:hasOwnProperty 无法检查该对象的原型链中是否具有该属性

三:call和apply

function add(a,b){ console.log(a+b); }    function sub(a,b){ console.log(a-b); }    function A(name,age){        this.name=name;        this.age=age;        this.showName=function(){ console.log(this.name) }    }    function B(name){        this.name=name;        this.showText=function(){ console.log("B-text"); }    }    var A1=new A();    var B1=new B();    A1.showName.call(B1); // 输出 undefined    function C(name){        A.call(this,name); // 即用call就可以继承A的方法,还可同时继承多个    }    var C1=new C("yuyu");    C1.showName(); // 输出yuyu    // 对象的继承有三种方法 apply call extend:prototype.js的实现方式是:    Object.extend = function(destination, source) {        for (property in source) {            destination[property] = source[property];        }        return destination;    }    function D(name,age){        A.apply(this,arguments); // apply和call的区别是:apply能将参数依次传进A中。且参数name和age是和A中对应的。如果不对应,则应该是A.call(this,age,name)        B.apply(this,arguments);    }    var D1=new D("D",24);    D1.showName(); // 输出D    console.log(D1.age); // 输出24    D1.showText(); // 输出B-text*/    // apply的两个实例;call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments    var arr1=[1,6,3,4],arr2=[5,9,0];//获取arr中的最大数;Math.max后面可以接任意个参数,最后返回所有参数中的最大值。Math.max(arr);写法错误    console.log( Math.max.apply(null,arr1) ); // 输出6    Array.prototype.push.apply(arr2,arr1);    console.log(arr2); // 输出 [5, 9, 0, 1, 6, 3, 4]

 

  patches({        of:function() {            return Array.prototype.slice.call(arguments); //相当于arguments.slice();将arguments转换为数组        },        isArray:function(arg) {            return Object.prototype.toString.call(arg) === [object Array];        }    }, Array);

 3.1:

 /* typeof 只能判断出"number" "string" " undefined" "boolean" ‘object"  对对象,数组,函数统一返回"object" */  console.log(typeof(123)); //number  console.log(typeof("123")); //string  console.log(typeof(undefined)); //undefined  console.log(typeof(true)); //boolean  console.log(typeof({})); //object  console.log(typeof([])); //object  console.log(typeof(function(){})); //function  /* instanceof 可以判断typeof 不能判断出的数组,对象,函数 */   var a={},b=[],c=function(){};   console.log(a instanceof Object); // a b c 都为true   console.log(c instanceof Array);   //只有b为true   console.log(c instanceof Function);  // 只有c为true   console.log( (a instanceof Object) && !(a instanceof Function) && !(a instanceof Array));// 判断a对象 true   console.log((b instanceof Object) && (b instanceof Array)); // 判断为数组   console.log((c instanceof Object)&&(c instanceof Function)); // 判断为函数   /* Object.prototype.toString.call() 可以判断所有的值 */    console.log(Object.prototype.toString.call(123)); //[objcet Number]    console.log(Object.prototype.toString.call(‘123‘)); //[object String]    console.log(Object.prototype.toString.call(undefined)); //[object Undefined]    console.log(Object.prototype.toString.call(true)); //[object Boolean]    console.log(Object.prototype.toString.call({})); //[object Object]    console.log(Object.prototype.toString.call([])); //[object Array]    console.log(Object.prototype.toString.call(function(){})); //[object Function]  

  3.2:Array.prototype.slice.call(arguments,0);将参数转换成真正的数组,call的作用是改变this的指向,就相当于arguments调用了,slice这个方法。0就是start=0,end没指定,所以返回整个arguments

/* slice 经常用来将 array-like 对象转换为 true array。在一些框架中会经常有这种用法。 */var s="123456";var b=[1,2,3,4,5]console.log(s.slice(0,4)); //1234console.log(b.slice(0,4)); //[1, 2, 3, 4]

  3.2:为什么不用arguments.slice(0);slice要求有leng属性,arguments有length,但是没有slice方法,因为Array是类名,而不是对象名,所以不能直接用Array.slice

四:

 patches({        entries:function() {            return Iterator(this);        },        every:function(fun) {            ‘use strict‘;            if (this === void 0 || this === null) //void 0=undefined                throw new TypeError();            var t = Object(this);            var len = t.length >>> 0;            if (typeof fun !== ‘function‘)                throw new TypeError();            var thisArg = arguments.length >= 2 ? arguments[1] : void 0;            for (var i = 0; i < len; i++) {                if (i in t && !fun.call(thisArg, t[i], i, t))                    return false;            }            return true;        },        fill:function(value) {            var O = Object(this);            var len = parseInt(O.length);            var start = arguments[1];            var relativeStart = parseInt(start) || 0;            var k = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len);            var end = arguments[2];            var relativeEnd = end === undefined ? len  : (parseInt(end) || 0);            var final = relativeEnd < 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len);            for (; k < final; k++) {                O[k] = value;            }            return O;        },        filter:function(fun) {            "use strict";            if (this === void 0 || this === null)                throw new TypeError();            var t = Object(this);            var len = t.length >>> 0;            if (typeof fun !== "function")                throw new TypeError();            var res = [];            var thisArg = arguments.length >= 2 ? arguments[1] : void 0;            for (var i = 0; i < len; i++) {                if (i in t) {                    var val = t[i];                    if (fun.call(thisArg, val, i, t))                        res.push(val);                }            }            return res;        },        find:function(filter, context) {            var index = this.findIndex(filter, context);            if(index >= 0) {                return this[index];            }else {                return undefined;            }        },        findIndex:function(filter, context) {            if(typeof filter != ‘function‘) {                throw new TypeError(‘filter must be a function‘);            }            var list = Object(this);            var len = list.length >>> 0;            var value;            for(var i=0;i<len;i++) {                if(i in list) {                    value = http://www.mamicode.com/list[i];"stop iterate");                }                return {                    value:value[0],                    done:this.current >= this.length                };            };            return ite;        },        forEach:function(callback, thisArgs) {            var t, k;            if(this == null) {                throw new TypeError(‘this is null or undefined‘);            }            var o = Object(this);            var len = o.length >>> 0;            if(typeof callback != ‘function‘) {                throw new TypeError(‘callback is not a function‘);            }            if(thisArgs)                t = thisArgs;            k = 0;            while(k < len) {                var kValue;                if(k in o) {                    kValue = http://www.mamicode.com/o[k];"this" is null or not defined‘);            }            var length = this.length >>> 0;            fromIndex = +fromIndex || 0;            if (Math.abs(fromIndex) === Infinity) {                fromIndex = 0;            }            if (fromIndex < 0) {                fromIndex += length;                if (fromIndex < 0) {                    fromIndex = 0;                }            }            for (; fromIndex < length; fromIndex++) {                if (this[fromIndex] === searchElement && fromIndex in this) {                    return fromIndex;                }            }            return -1;        },        lastIndexOf: function(searchElement) {            ‘use strict‘;            if (this === void 0 || this === null) {                throw new TypeError();            }            var n, k,                t = Object(this),                len = t.length >>> 0;            if (len === 0) {                return -1;            }            n = len - 1;            if (arguments.length > 1) {                n = Number(arguments[1]);                if (n != n) {                    n = 0;                }                else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) {                    n = (n > 0 || -1) * Math.floor(Math.abs(n));                }            }            for (k = n >= 0 ? Math.min(n, len - 1) : len - Math.abs(n); k >= 0; k--) {                if (k in t && t[k] === searchElement) {                    return k;                }            }            return -1;        },        map:function(callback, thisArg) {            var T, A, k;            if (this == null) {                throw new TypeError(" this is null or not defined");            }            var O = Object(this);            var len = O.length >>> 0;            if (typeof callback !== "function") {                throw new TypeError(callback + " is not a function");            }            if (thisArg) {                T = thisArg;            }            A = new Array(len);            k = 0;            while (k < len) {                var kValue, mappedValue;                if (k in O) {                    var Pk = k.toString();                    kValue = http://www.mamicode.com/O[Pk];>

  4.1: ‘use strict‘

 "use strict"; var num =012; alert(num);// IE678下还是能打印出来为10,chrome,ff下没有反应

    4.1.1:如果给JavaScript代码标志为“严格模式”,则其中运行的所有代码都必然是严格模式下的。IE6,7,8,9均不支持严格模式。

    4.1.2:位置:必须在全局代码的开始处加入。在eval代码开始处加入。在函数声明代码开始处加入。在new Function()所传入的body参数块开始加入。

    4.1.3:

        .在非严格模式下,可以使用0(零)开头前缀声明8进制。但是在严格模式下,会产生错误。

            .在代码中不能使用一些扩展的保留字:implements,interface,let,package,private,public,static,yield

                       .with语句也不能使用。
                       .不能声明或重写eval和arguments两个标识符。
                       .不能用delete 删除显式声明的标识符,名称或具名函数。

        .caller,callee,在严格模式下就不能使用的

    4.2:this === void 0

    4.2.1:void(0)的含义: void 运算符对表达式求值,并返回 undefined。 javascrīpt:void (expression)或者 javascrīpt:void expression;计算expression;

    4.2.2: <A HREF="http://www.mamicode.com/javascrīpt:void(0)"> <A HREF="http://www.mamicode.com/javascrīpt:void(document.form.submit())">与href=http://www.mamicode.com/#的区别;#,包含了一个位置信息,默认的锚点是#top

    4.2.3:if (this === void 0 || this === null) undefined和null的区别:

        1:undefined申明的变量没有被初始化时;var a;

var a;console.log(a == undefined); // trueconsole.log(document.getElementById(b) == null); // trueconsole.log(typeof undefined); // undefinedconsole.log(typeof null);   // object js的一个错误,被认为null即是一个不存在的对象的占位符console.log(null == undefined); //true EMCAscript认为undefined是从null派生出来的,定义为相等console.log(null === undefined); //false 判断是否相等console.log(typeof null == typeof undefined); //false 判断是否相等console.log(null + 123); // 123 null参加运算,自动算为0console.log(b == null); // Uncaught ReferenceError: b is not definedconsole.log(b == undefined); // Uncaught ReferenceError: b is not defined

 

   4.3:throw new TypeError()  Error对象

 try{     abc }catch(e){     for (var p in e){ document.writeln(p+‘=‘+e[p]+";"); } }
// IE下输出name=TypeError; message=‘abc‘ 未定义; number=-2146823279; description=‘abc‘ 未定义;用var errCode = err.number& x0FFFF; 以到http://msdn.microsoft.com/en-us/library/1dk3k160(VS.85).aspx微软msdn上查找此错误码对应的。5009对应的错误是Undefined identifier。
// ff下输出fileName=file:///D:/1-study1/test11.html; lineNumber=16; columnNumber=5;
// chrome下无输出 

  4.3.1:捕获异常下Error对象的属性有name(错误名),number(错误号),description(描述),message(多同description),ff下有fileName...;

    .EvalError: 错误发生在eval()中
           .SyntaxError: 语法错误,错误发生在eval()中,因为其它点发生SyntaxError会无法通过解释器
    .RangeError: 数值超出范围
    .ReferenceError: 引用不可用
    .TypeError: 变量类型不是预期的
    .URIError: 错误发生在encodeURI()或decodeURI()中

  4.3.2:抛出异常:

4.4:object(this);Object对象

  4.4.1:提供所有javascript对象共有的功能。obj = new Object(x);如果x不是对象,则返回未修改的对象,如果x是null,undefined或者未提供,则创建无内容的对象。

  4.4.2:属性:_proto_Property(为对象指定原型);constructor(指定创建一个对象的函数),prototype(为对象的类型返回原型的引用)

  4.4.3:函数:create,defineProperties(将一个或者多个添加或修改到对象);defineProperty,freeze(禁止添加),getOwnPropertyDescriptor(获得属性定义)

      getOwnPropertyNames(获得对象的属性和方法名称);getPrototypeOf(返回对象的原型),isExtensible(是否可像对象添加属性),isSealed,keys(返回对象可枚举属性和方法的名称),preventExpression(阻止向对象添加新属性);seal(阻止修改现有属性的特效,并阻止添加新属性)

  4.4.4:方法:hasOwnProperty,isPrototypeOf,propertyEnumerable,toLocaleString,toString,valueOf

    4.4.5:Object(this)

    var x;    x={"yj":123,"er":2} //Object {yj: 123, er: 2}     x=undefined; // Object {}    x=null; //Object {}     x=function a(){}; //function a(){}     x=123; //String {0: "1", 1: "2", 2: "3", length: 3, [[PrimitiveValue]]: "123"}    x=123; //Number {[[PrimitiveValue]]: 123}    x=false; //Boolean {[[PrimitiveValue]]: false}    x= Object(x);    console.log(x);

 

4.5:t.length >>> 0右移运算符:>>> 运算符将 expression1 的位右移 expression2 中指定的位数。 用零填充右移后左边空出的位。 右移的位被丢弃。 例如:变量 temp 具有初始值 -14(二进制补码 11111111 11111111 11111111 11110010)。 其右移两位后,值等于 1073741820(即二进制的 00111111 11111111 11111111 11111100)。

4.6:fromIndex = +fromIndex || 0; 相当于:fromIndex = fromIndex || 0; +号不起作用。

4.7:  else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) ---- (1/0):Infinity ;-(1 / 0):-Infinity 

4.8:Date

  4.8.1:Date.parse(‘Jul 8,2005‘);返回与1970.1.1午夜之间的毫秒数;1s=1000ms

  4.8.2:new Date().getTimezoneOffset()/60 输出-8;getTimezoneOffset() 方法返回的是本地时间与 GMT 时间或 UTC 时间之间相差的分钟数。实际上,该函数告诉我们运行 JavaScript 代码的时区,以及指定的时间是否是夏令时。

  4.8.3:Date.UTC(year, month, day, hours, minutes, seconds, microseconds);同parse,返回毫秒数。Date.UTC(1980, 12, 17);

  1. year - 作为date对象的年份,为4位年份值
  2. month - 0-11之间的整数,做为date对象的月份
  3. day - 1-31之间的整数,做为date对象的天数
  4. hours - 0(午夜24点)-23之间的整数,做为date对象的小时数
  5. minutes - 0-59之间的整数,做为date对象的分钟数
  6. seconds - 0-59之间的整数,做为date对象的秒数
  7. microseconds - 0-999之间的整数,做为date对象的毫秒数

  4.8.4:toJSON()方法用來取得日期物件中的JSON格式的日期字串,JSON格式的日期字串跟 ISO-8601標準: YYYY-MM-DDTHH:mm:ss.sssZ是一樣的  console.log(new Date().toJSON()); // 2014-11-17T10:13:07.328Z

  4.8.5:13.67.tofixed(1);== 13.7:四舍五入为以为小数。

  4.8.6:arr.concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本

4.9:JSON

 

 // JavaScript 对象表示法(JavaScript Object Notation)。JSON 是存储和交换文本信息的语法。类似 XML。JSON 比 XML 更小、更快,更易解析。JSON 数据可使用 AJAX 进行传输    // 用eval() 方法进行解析,JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 JSON 数据转换为 JavaScript 对象,然后在网页中使用该数据。    // 格式:数据在名称/值对中,数据由逗号分隔,花括号保存对象,方括号保存数组    // { "employees": [ { "firstName":"John" , "lastName":"Doe" }, { "firstName":"Anna" , "lastName":"Smith" }, { "firstName":"Peter" , "lastName":"Jones" } ] }    // var employees = [ { "firstName":"Bill" , "lastName":"Gates" }, { "firstName":"George" , "lastName":"Bush" }, { "firstName":"Thomas" , "lastName": "Carter" } ];    var txt = { "employees" : [{ "A":"A1"},{ "A":"A2","B":"B2"}]};    var obj = eval ("(" + txt + ")");    console.log(obj.employees[0].A); //输出:A1    // 这两个方法分别用于stringify()把JavaScript对象序列化为JSON字符串,parse()把JSON字符串解析为原生JavaScript    var A = {name:"yuyu",age:24,a:undefined,func1:function(){}};    var B=["yuyu","yuyu2",1];    var C=[1,2];    function fun1(key,value){        return value.toString().toUpperCase();    }    console.log(A); // 输出:Object {name: "yuyu", age: 24, a: undefined, func1: function}    console.log(JSON.stringify(A)); // 输出 {"name":"yuyu","age":24},所有函数,值为undefined的任何属性也都会被跳过,a和func1不会输出    console.log(JSON.parse(JSON.stringify(A))); // 输出 Object {name: "yuyu", age: 24}    console.log(JSON.stringify(B)); //输出:["yuyu","yuyu2",1]    console.log(JSON.stringify(B,fun1)); //输出:"YUYU,YUYU2,1";第二个参数是function时,对B进行func1    console.log(JSON.stringify(A,C));    console.log(JSON.stringify(B,C,10));// 第二个为数组时对输出没有影响,第三个参数表示缩进的格数   /* [        "yuyu",        "yuyu2",        1    ]*/
// slice截取start到end的数组,不包含end,返回截取的数组,splice删除start开始的几个数,返回删除掉的数var arr1=[1,2,3,4,5,6];console.log(arr1.slice(1,4)); //输出:[2, 3, 4] console.log(arr1);  // 输出:[1, 2, 3, 4, 5, 6]console.log(arr1.splice(1,4));  // 输出:[2, 3, 4, 5]console.log(arr1);  // 输出:[1, 6]

 

baseline.js