美文网首页
Javascript基础总结(一)

Javascript基础总结(一)

作者: 积微微微 | 来源:发表于2016-10-08 19:40 被阅读25次

    Javascript数据类型

    五种基本类型 Undefined , Null,Number,Boolean,String 。
    引用类型均为对象 ,包括 Object,Function, Array, Error,RegExp,Date,,Math,JSON。
    typeof 关键字用来区分原始值和对象,并确定原始值。

    typeof undefined
    "undefined"
    typeof 12
    "number"
    typeof ''
    "string"
    typeof true
    "boolean"
    typeof null
    "object"
    typeof {}
    "object"
    var fun = function (){};typeof fun
    "function"
    

    typeof null 返回object 是一个不能修正的bug,因为这会破坏现有的代码。其原因在《深入理解Javascript》一书中这样解释:

    第一代Javascript 引擎中的JavaScript值表示为32位的字符。最低3位作为一种标识,表示值是对象,整数,浮点数或者布尔值。对象的标识是000。而为了表现null值,引擎使用了机器语言的NULL指针,该字符的所有位都是0。而typeof就是检测值的标志位,所以typeof认为null是一个对象。

    判断是否为对象,可以使用如下方法:

    function isObject(obj){
        return obj === null && (typeof obj === 'object' || typeof obj ==='function');
    }
    

    instanceof 运算符检测对象是否是给定的构造函数的实例。instanceof 对五种基本类型的值总是false。

    value instanceof Constr
    

    判断value 是由构造函数Constr 还是子构造函数(subconstructor)创建的。所以它是检测Constr 是否在value 的原型链上。下面两个表达式是等价的:

    value instanceof Constr
    Constr.prototype.isPrototypeOf(value)
    

    对象的类型可以通过调用内置对象Object的toString方法来进行判断。当然,基本类型也可以这样判断,判断基本类型时实际是将其包装成对应的包装对象(后面会说到包装对象),然后调用对象的方法。一般不需要这样做,typeof就可以判断基本类型。基本类型的值是没有属性和方法的。

    Object.prototype.toString.call(null);
    "[object Null]"
    Object.prototype.toString.call('abc');
    "[object String]"
    Object.prototype.toString.call(12);
    "[object Number]"
    Object.prototype.toString.call(true);
    "[object Boolean]"
    Object.prototype.toString.call(undefined);
    "[object Undefined]"
    Object.prototype.toString.call(function(){});
    "[object Function]"
    Object.prototype.toString.call({});
    "[object Object]"
    Object.prototype.toString.call([]);
    "[object Array]"
    Object.prototype.toString.call(/abc/);
    "[object RegExp]"
    Object.prototype.toString.call(new Date());
    "[object Date]"
    

    Object.prototype.toString ( ) 当调用 toString 方法,采用如下步骤:

    1. 如果 this 的值是 undefined, 返回 "[object Undefined]".
    2. 如果 this 的值是 null, 返回 "[object Null]".
    3. 令 O 为以 this 作为参数调用 ToObject 的结果 .
    4. 令 class 为 O 的 [[Class]] 内部属性的值
    5. 返回三个字符串 "[object ", class, and "]" 连起来的字符串 .

    基本类型的包装对象

    布尔值,数字,字符串这三种原始值都有相应的构造函数:Boolean,Number,String。他们的实例称为包装对象,包含原始值。这些构造函数有两种用法。
    (1)作为构造函数,构造的对象与原始值存在很大差异

    > new String('abc') === 'abc'
    false
    > typeof new String('abc')
    "object"
    

    (2)作为函数,将传入的参数转成对应的原始值(转换成字符串,数字,布尔值和对象的函数)。

    >  Number('12');
    12
    

    原始值通过调用包装构造函数进行包装,通过调用valueOf()方法来进行去包装,所有的对象都有该方法。

    new Number(123) //包装
    new Number(123).valueOf() //去包装
    

    将包装对象转换为原始值时,字符串和数字都可以得到正确的原始值,而布尔值则不能。

    >  Boolean(new Boolean(true)).valueOf()
    true
    >  Boolean(new Boolean(false)).valueOf()
    true
    

    其原因在于Boolean()函数将对象转化为布尔值时,所有的对象都会被转换成true。

    数据类型的转化

    Boolean() 转化为布尔值。

    下面的值将被转换为 false,除此之外的值都将被转换成 true。

    undefined, null, false, 0, NaN , ''
    
    Number() 转换成数字。

    undefined被转换成 NaN。 NaN表示 not a number , 它与任何值都不相等,包括自身。
    null 被转换成 0。
    false 被转换成 0, true 被转换成 1。
    字符串将会被解析。

    > Number('12abc');//不能解析成数字
    NaN
    > Number('12.34');//可以解析成数字
    12.34
    

    对象先转换成原始值(稍后会讲到),然后再将其原始值按照上述规则转换为数字。

    String() 转换为字符串。

    原始值转换为字符串的结果显而易见。

    String(null)
    "null"
    String(undefined)
    "undefined"
    String(12.34)
    "12.34"
    String('abc')
    "abc"
    String(false)
    "false"
    String(true)
    "true"
    

    对象会先转换为原始值,然后再转换为字符串。

    Object() 转换为对象。

    对象会转换为自身,不发生变化。 undefined 和 null 将会转换为 空对象,布尔值、数字、字符串会转换为相应的包装对象。

    ToPrimitive() -----将值转换为原始值
    要将任意值转换成数字或者是字符串,首先会将其转换为任意的原始值,然后再转换为最终的结果。
    ECMAScript规范中有一个内部函数 ToPrimitive() 实现转换的功能,该函数JavaScript中不能访问。
    该函数形如: ToPrimitive(input , PreferredType?)
    input表示输入需要进行类型转换的参数,可选参数PreferredType表示转换之后的类型:它可以是Number 或者 String,取决于ToPrimitive的结果希望转换成数字还是字符串。

    如果 PreferredType 是Number ,即期望得到的类型是Number,会执行以下步骤。
    (1)判断input 类型,如果 input 是一个原始值,直接返回。
    (2)否则,input是对象,调用input.valueOf(),如果结果是原始值,直接返回结果。
    (3)否则,调用input.toString(),如果结果是原始值,直接返回结果。
    (4) 否则,抛出一个TypeError(说明将输入转换为原始值出错了)。

    如果PreferredType是字符串,则交换步骤二和三,即先调用toString()方法,后调用valueOf()方法。
    JavaScript中valueOf函数方法是返回指定对象的原始值。
    每个JavaScript固有对象的 valueOf 方法定义不同。

    对象 返回值
    Array 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同。
    Boolean Boolean 值。
    Date 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。
    Function 函数本身。
    Number 数字值。
    Object 对象本身。这是默认情况。
    String 字符串值。

    Math 和 Error 对象没有 valueOf 方法。

    来源: http://www.jb51.net/article/32327.htm
    参考 : http://www.xuebuyuan.com/2234641.html

    上述如有错漏之处,敬请指教。

    相关文章

      网友评论

          本文标题:Javascript基础总结(一)

          本文链接:https://www.haomeiwen.com/subject/mnauyttx.html