JavaScript标准库,是深入JavaScript基本的入口
标准库提供了11中对象,由此引入面向对象思想:
 
1、Number对象
 
Number对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用。
作为构造函数时,它用于生成值为数值的对象。 var n = new Number(1);
 
1)静态属性
Number对象拥有一些静态属性(即直接定义在Number对象上的属性)
Number.POSITIVE_INFINITY:正的无限,指向Infinity
Number.NEGATIVE_INFINITY:负的无限,指向-Infinity
Number.NaN:表示非数值,指向NaN
 
2)实例方法
·Number.prototype.toString()
   a)  用来将一个数值转为字符串形式
   b)  可以接受一个参数,表示输出的进制
·Number.prototype.toFixed()
   a) 先将一个数转为指定位数的小数,然后返回这个小数对应的字符串
   b)  可以接受一个参数,表示指定的小数点后位数
·Number.prototype.toExponential()
   a)  用于将一个数转为科学计数法形式
·Number.prototype.toPrecision()
   a)  toPrecision方法用于将一个数转为指定位数的有效数字,精度
 
3)可以自定义
Number.prototype对象上面可以自定义方法,被Number的实例继承
Number.prototype.add = function (x) { return this + x;};
Number.prototype.subtract = function (x) { return this - x; };
 
8['add'](2)
(8).add(2).subtract(4)
 
2、String对象
 
String对象是 JavaScript 原生提供的三个包装对象之一,用来生成字符串对象。
除了用作构造函数,String对象还可以当作工具方法使用,将任意类型的值转为字符串。
 
String对象提供的静态方法(即定义在对象本身,而不是定义在对象实例的方法)
1)静态方法
String.fromCharCode()
该方法的参数是一个或多个数值,代表 Unicode 码点,返回值是这些码点组成的字符串
 
2)实例属性
String.prototype.length
字符串实例的length属性返回字符串的长度
 
3)常用的实例方法
·String.prototype.charCodeAt()
返回字符串指定位置的 Unicode 码点(十进制表示),相当于String.fromCharCode()的逆操作
 
·String.prototype.concat()
用于连接两个字符串,返回一个新字符串,不改变原字符串
 
·String.prototype.slice(start, end)
用于从原字符串取出子字符串并返回,不改变原字符串。
第一个参数是开始位置,第二个参数是结束位置(不含该位置)
 
·String.prototype.substring(start, end)
用于从原字符串取出子字符串并返回,不改变原字符串,跟slice方法很相像
第一个参数表示开始位置,第二个位置表示结束位置(返回结果不含该位置)
 
·String.prototype.substr(start, end)
用于从原字符串取出子字符串并返回,不改变原字符串,跟slice和substring方法的作用相同
substr方法的第一个参数是开始位置(从0开始计算),第二个参数是子字符串的长度
 
·String.prototype.indexOf(),String.prototype.lastIndexOf()
用于确定一个字符串在另一个字符串中第一次出现的位置返回结果是匹配开始的位置
如果返回-1,就表示不匹配, 还可以接受第二个参数,表示从该位置开始向后匹配
 
·String.prototype.match()
用于确定原字符串是否匹配某个子字符串,返回一个数组
成员为匹配的第一个字符串。如果没有找到匹配,则返回null
 
·String.prototype.search()
用法基本等同于match,但是返回值为匹配的第一个位置
如果没有找到匹配,则返回-1
 
 ·String.prototype.replace(char1, char2)
用于替换匹配的子字符串,一般情况下只替换第一个匹配
第一个参数时匹配的子字符串,第二个参数时替换的字符串
 
·String.prototype.repeat(12)
用于重复字符串多少次,类似对字符串左乘法
js中不支持字符串*Num, 必须使用此方法 obj.repeat(Num)
 
·String.prototype.trim()
用于去除字符串两端的空格,返回一个新字符串,不改变原字符串
 
·String.prototype.toLowerCase(),String.prototype.toUpperCase()
用于将一个字符串全部转为小写,或者全部转为大写。它们都返回一个新字符串,不改变原字符串
 
·String.prototype.split()
按照给定规则分割字符串,返回一个由分割出来的子字符串组成的数组
如果省略参数,则返回数组的唯一成员就是原字符串
 
·String.prototype.localeCompare()
localeCompare方法用于比较两个字符串。它返回一个整数,
如果小于0,表示第一个字符串小于第二个字符串;
如果等于0,表示两者相等;
如果大于0,表示第一个字符串大于第二个字符串。
 
3、Math对象
 
Math是 JavaScript 的原生对象,提供各种数学能力
该对象不是构造函数,不能生成实例,所有的属性和方法都必须在Math对象上调用。
 
1)静态属性 ,数学常数
Math.E:常数e。
Math.LN2:2 的自然对数。
Math.LN10:10 的自然对数。
Math.LOG2E:以 2 为底的e的对数。
Math.LOG10E:以 10 为底的e的对数。
Math.PI:常数π。
Math.SQRT1_2:0.5 的平方根。
Math.SQRT2:2 的平方根。
 
2)静态方法
Math.abs():绝对值    |    Math.ceil():向上取整    |    Math.floor():向下取整 
Math.max():最大值    |    Math.min():最小值    |    Math.pow():指数运算
Math.sqrt():平方根    |    Math.log():自然对数    |    Math.exp():e的指数  
Math.round():四舍五入    |   Math.random():随机数
详解:
Math.max(),Math.min()
如果参数为空, Math.min返回Infinity, Math.max返回-Infinity
 
Math.pow()
Math.pow方法返回以第一个参数为底数、第二个参数为幂的指数值
 
Math.floor(),Math.ceil()
Math.floor方法返回小于参数值的最大整数(地板值)
 
Math.sqrt()
Math.sqrt方法返回参数值的平方根。如果参数是一个负值,则返回NaN
 
Math.log()
Math.log方法返回以e为底的自然对数值
 
Math.exp()
Math.exp方法返回常数e的参数次方
 
Math.random()
Math.random()返回0到1之间的一个伪随机数,可能等于0,但是一定小于1
 
3)三角函数方法
Math.sin():返回参数的正弦(参数为弧度值)
Math.cos():返回参数的余弦(参数为弧度值)
Math.tan():返回参数的正切(参数为弧度值)
Math.asin():返回参数的反正弦(返回值为弧度值)
Math.acos():返回参数的反余弦(返回值为弧度值)
Math.atan():返回参数的反正切(返回值为弧度值)
 
 
4、Array对象
 
Array是 JavaScript 的原生对象,同时也是一个构造函数,可以用它生成新的数组
作为构造函数,事实上存在缺陷,因此不建议使用它的构造函数特性。
 
1)静态方法
Array.isArray()
返回一个布尔值,表示参数是否为数组。它可以弥补typeof运算符的不足
 
2、实例方法
·valueOf(),toString()
数组的valueOf()方法返回数组本身
数组的toString()方法数组的字符串模式
 
·push(),pop()
push方法用于在数组的末端添加一个或多个元素,并返回新数组长度
pop方法用于删除数组的最后一个元素。注意,两个方法会改变原数组
 
·shift(),unshift()
shift方法删除数组的第一个元素,并返回该元素。注意,两个方法会改变原数组
unshift方法在数组的第一个位置添加元素,并返回添加新元素后的数组长度
 
·indexOf(),lastIndexOf()
返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1
 
·join()
数组的join方法以指定参数作为分隔符,将所有成员连接为一个字符串返回。
默认用逗号分隔,这格就类似ruby的join,与python的(str.join)相反
 
·concat()
用于多个数组的合并组成新的数组,其参数不一定是数组对象
它将更新数组的成员,添加到原数组成员的后部,然后返回一个新数组
 
·reverse()
用于颠倒排列数组元素,返回改变后的数组。
注意,该方法将改变原数组
 
·slice(start, end)
用于提取目标数组的一部分,返回一个新数组,原数组不变
注意参数中,包括首位置但不包括结束位置,如果是负数,从末尾开始计算
 
·splice(start, count, addElement1, addElement2, ...)
用于替换原数组中的元素,指定起始位置和替换个数,
返回值是被删除的元素。注意,该方法会改变原数组。好比replace()
 
·sort()
对数组成员进行排序,默认是按照字典顺序排序
排序后,原数组将被改变
 
·map(func(n) { 代码块 } )
将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回
这个操作类似ruby中的数组对象each方法,同时功能也好比python中的map方法
 
·forEach(func(n) { 代码块 })
forEach方法与map方法很相似,但是不返回值,只用来操作数据。这就是说,
对数组的所有成员依次执行参数函数。注意的是:函数同样接受三个参数:当前值、当前位置、整个数组
 
·filter(func(n) { 代码块 })
用于过滤数组成员,所有数组成员依次执行该函数,返回结果为true的成员
组成一个新数组返回, 该方法不会改变原数组。
 
·some(),every()
这两个方法类似“断言”(assert),返回一个布尔值,表示判断数组成员是否符合某种条件。
它们接受一个函数作为参数,所有数组成员依次执行该函数。该函数接受三个参数:
当前成员、当前位置和整个数组,然后返回一个布尔值。
some方法是只要一个成员的返回值是true,则整个some方法的返回值就是true,否则返回false。
 
·reduce(),reduceRight()
reduce方法和reduceRight方法依次处理数组的每个成员,最终累计为一个值
它们的差别是,reduce是从左到右处理(从第一个成员到最后一个成员)
reduceRight则是从右到左(从最后一个成员到第一个成员),其他完全一样
 
5、Date对象
 
Date对象是 JavaScript 原生的时间库。它以国际标准时间(UTC)、
1970年1月1日00:00:00作为时间的零点,可以表示的时间范围是前后各1亿天(单位为毫秒)
 
Date对象可以作为普通函数直接调用,返回一个代表当前时间的字符串
Date还可以当作构造函数使用。对它使用new命令,会返回一个Date对象的实例
 
关于构造函数,有几点需要注意:
第一点,参数可以是负整数,代表1970年元年之前的时间
第二点,只要是能被Date.parse()方法解析的字符串,都可以当作参数
第三,参数为年、月、日等多个整数时,年和月是不能省略的,其他参数都可以省略的
 
类型自动转换时,Date实例如果转为数值,则等于对应的毫秒数;
如果转为字符串,则等于对应的日期字符串。
所以,两个日期实例对象进行减法运算时,返回的是它们间隔的毫秒数;
进行加法运算时,返回的是两个字符串连接而成的新字符串
 
1)静态方法
·Date.now()
返回当前时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数,相当于 Unix 时间戳乘以1000
·Date.parse()
用来解析日期字符串,返回该时间距离时间零点(1970年1月1日 00:00:00)的毫秒数。
它的参数是:YYYY-MM-DDTHH:mm:ss.sssZ(符合 RFC 2822 和 ISO 8061 这两个标准)
·Date.UTC()
Date.UTC方法接受年、月、日等变量作为参数,
返回该时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数。
 
2)实例方法
Date的实例对象,有几十个自己的方法,除了valueOf和toString,可以分为以下三类。
 
to类:从Date对象返回一个字符串,表示指定的时间
get类:获取Date对象的日期和时间
set类:设置Date对象的日期和时间
 
Date.prototype.valueOf()
返回实例对象距离时间零点(1970年1月1日00:00:00 UTC)对应的毫秒数,该方法等同于getTime方法
 
to 类方法
    Date.prototype.toString() ==> toString方法返回一个完整的日期字符串
    Date.prototype.toUTCString() ==> 返回对应的 UTC 时间,比北京时间晚8个小时
    Date.prototype.toISOString() ==> 返回对应时间的 ISO8601 写法
    Date.prototype.toJSON() ==> 返回一个符合 JSON 格式的 ISO 日期字符串,等同toISOString方法
    Date.prototype.toDateString() ==> 返回日期字符串(不含小时、分和秒)
    Date.prototype.toTimeString() ==> 返回时间字符串(不含年月日)
 
    本地时间(包括三种方法)
可以将 Date 实例转为表示本地时间的字符串。
    Date.prototype.toLocaleString():完整的本地时间。
    Date.prototype.toLocaleDateString():本地日期(不含小时、分和秒)
    Date.prototype.toLocaleTimeString():本地时间(不含年月日
 
get 类方法
Date对象提供了一系列get*方法,用来获取实例对象某个方面的值。
    getTime():返回实例距离1970年1月1日00:00:00的毫秒数,等同于valueOf方法
    getDate():返回实例对象对应每个月的几号(从1开始)
    getDay():返回星期几,星期日为0,星期一为1,以此类推
    getFullYear():返回四位的年份
    getMonth():返回月份(0表示1月,11表示12月)
    getHours():返回小时(0-23)
    getMilliseconds():返回毫秒(0-999)
    getMinutes():返回分钟(0-59)
    getSeconds():返回秒(0-59)
    getTimezoneOffset():返回当前时间与 UTC 的时区差异,以分钟表示,返回结果考虑到了夏令时因素。
所有这些get*方法返回的都是整数,不同方法返回值的范围不一样。
 
分钟和秒:0 到 59 ~ 小时:0 到 23 ~ 星期:0(星期天)到 6(星期六)
日期:1 到 31 ~ 月份:0(一月)到 11(十二月)
 
set 类方法
Date对象提供了一系列set*方法,用来设置实例对象的各个方面。
    setDate(date):设置实例对象对应的每个月的几号(1-31),返回改变后毫秒时间戳。
    setFullYear(year [, month, date]):设置四位年份。
    setHours(hour [, min, sec, ms]):设置小时(0-23)。
    setMilliseconds():设置毫秒(0-999)。
    setMinutes(min [, sec, ms]):设置分钟(0-59)。
    setMonth(month [, date]):设置月份(0-11)。
    setSeconds(sec [, ms]):设置秒(0-59)。
    setTime(milliseconds):设置毫秒时间戳。
这些方法基本是跟get*方法一一对应的,但是没有setDay方法,
因为星期几是计算出来的,而不是设置的。另外,需要注意的是,
凡是涉及到设置月份,都是从0开始算的,即0是1月,11是12月
 
 
6、RgExp对象
 
正则表达式(regular expression)是一种表达文本模式(即字符串结构)的方法
有点像字符串的模板,常常用来按照“给定模式”匹配文本
比如,正则表达式给出一个 Email 地址的模式,然后用它来确定一个字符串是否为 Email 地址
JavaScript 的正则表达式体系是参照 Perl 5 建立的
 
一种是使用字面量,以斜杠表示开始和结束,另一种是使用RegExp构造函数
 
1)实例属性
正则对象的实例属性分成两类
 
一类是修饰符相关,用于了解设置了什么修饰符。
    RegExp.prototype.ignoreCase:返回一个布尔值,表示是否设置了i修饰符。
    RegExp.prototype.global:返回一个布尔值,表示是否设置了g修饰符。
    RegExp.prototype.multiline:返回一个布尔值,表示是否设置了m修饰符。
    RegExp.prototype.flags:返回一个字符串,包含了已经设置的所有修饰符,按字母排序
 
2)实例方法
    RegExp.prototype.test()
正则实例对象的test方法返回一个布尔值,表示当前模式是否能匹配参数字符串
    RegExp.prototype.exec()
正则实例对象的exec方法,用来返回匹配结果。如果发现匹配,就返回一个数组,
成员是匹配成功的子字符串,否则返回null
 
字符串的实例方法之中,有4种与正则表达式有关。
 
    String.prototype.match():返回一个数组,成员是所有匹配的子字符串
    String.prototype.search():按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置
    String.prototype.replace():按照给定的正则表达式进行替换,返回替换后的字符串
    String.prototype.split():按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员
 
1)点字符(.)
点字符(.)匹配除回车(\r)、换行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
注意,对于码点大于0xFFFF字符,点字符不能正确匹配,会认为这是两个字符。
 
2)位置字符
位置字符用来提示字符所处的位置,主要有两个字符。
^ 表示字符串的开始位置
$ 表示字符串的结束位置
 
3)选择符(|)
竖线符号(|)在正则表达式中表示“或关系”(OR),即cat|dog表示匹配cat或dog
 
4)转义符
正则表达式中那些有特殊含义的元字符,如果要匹配它们本身,
就需要在它们前面要加上反斜杠。比如要匹配+,就要写成\+。
 
正则表达式对一些不能打印的特殊字符,提供了表达方法
 
    \cX 表示Ctrl-[X],其中的X是A-Z之中任一个英文字母,用来匹配控制字符
    [\b] 匹配退格键(U+0008),不要与\b混淆
    \n 匹配换行键
    \r 匹配回车键
    \t 匹配制表符 tab(U+0009)
    \v 匹配垂直制表符(U+000B)
    \f 匹配换页符(U+000C)
    \0 匹配null字符(U+0000)
    \xhh 匹配一个以两位十六进制数(\x00-\xFF)表示的字符
    \uhhhh 匹配一个以四位十六进制数(\u0000-\uFFFF)表示的 Unicode 字符
    $&:匹配的子字符串
    $`:匹配结果前面的文本
    $':匹配结果后面的文本
    $n:匹配成功的第n组内容,n是从1开始的自然数。
    $$:指代美元符号$
字符类(class)表示有一系列字符可供选择,只要匹配其中一个就可以了。
所有可供选择的字符都放在方括号内,比如[xyz] 表示x、y、z之中任选一个匹配
 
1)脱字符(^)
如果方括号内的第一个字符是[^],则表示除了字符类之中的字符,
其他字符都可以匹配。比如,[^xyz]表示除了x、y、z之外都可以匹配
 
2)连字符(-)
某些情况下,对于连续序列的字符,连字符(-)用来提供简写形式,表示字符的连续范围。
比如,[abc]可以写成[a-c],[0123456789]可以写成[0-9],同理[A-Z]表示26个大写字母。
 
预定义模式指的是某些常见模式的简写方式
 
    \d 匹配0-9之间的任一数字,相当于[0-9]
    \D 匹配所有0-9以外的字符,相当于[^0-9]
    \w 匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]
    \W 除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_]
    \s 匹配空格(包括换行符、制表符、空格符等),相等于[ \t\r\n\v\f]
    \S 匹配非空格的字符,相当于[^ \t\r\n\v\f]
    \b 匹配词的边界
    \B 匹配非词边界,即在词的内部
 
模式的精确匹配次数,使用大括号({})表示。{n}表示恰好重复n次,
{n,}表示至少重复n次,{n,m}表示重复不少于n次,不多于m次
 
 
7、JSON对象
 
JSON 格式(JavaScript Object Notation 的缩写)是一种用于数据交换的文本格式
2001年由 Douglas Crockford 提出,目的是取代繁琐笨重的 XML 格式
 
相比 XML 格式,JSON 格式有两个显著的优点:书写简单,一目了然;
符合 JavaScript 原生语法,可以由解释引擎直接处理,不用另外添加解析代码
所以,JSON 迅速被接受,已经成为各大网站交换数据的标准格式,并被写入标准
 
每个 JSON 对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值。
总之,只能是一个值,不能是两个或更多的值。
 
JSON 对值的类型和格式有严格的规定:
  • 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象
  • 原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null
(不能使用NaN, Infinity, -Infinity和undefined)
 
  • 字符串必须使用双引号表示,不能使用单引号
  • 对象的键名必须放在双引号里面
  • 数组或对象最后一个成员的后面,不能加逗号
 
JSON 对象 ——  JavaScript 的原生对象,用来处理 JSON 格式数据
它有两个静态方法:JSON.stringify()和JSON.parse()
 
JSON.parse() ==》用于将 JSON 字符串转换成对应的值
JSON.stringify() ==》用于将一个值转为 JSON 字符串
 
注意:
还可以接受一个数组,作为第二个参数,指定需要转成字符串的属性
然后:
还可以接受第三个参数,用于增加返回的 JSON 字符串的可读性
  • 如果是数字,表示每个属性前面添加的空格(最多不超过10个)
  • 如果是字符串(不超过10个字符),则该字符串会添加在每行前面
参数对象的 toJSON 方法,如果参数对象有自定义的toJSON方法,
那么JSON.stringify会使用这个方法的返回值作为参数,而忽略原对象的其他属性。
 
 
8、Boolean对象
 
Boolean对象是 JavaScript 的三个包装对象之一。
作为构造函数,它主要用于生成布尔值的包装对象实例。
 
Boolean 函数的类型转换作用
Boolean对象除了可以作为构造函数,还可以单独使用,
将任意值转为布尔值。这时Boolean就是一个单纯的工具方法
 
============================================
 
1、Object对象
 
JavaScript 原生提供Object对象(注意起首的O是大写)
原理:所有其他对象都继承自Object对象,即那些对象都是Object的实例。
 
Object对象的原生方法分成两类:Object本身的方法与Object的实例方法
如果把Object看作原始类(类似Ruby)那么包括类方法和实例方法
 
1)Object对象本身的方法
所谓“本身的方法”就是直接定义在Object对象的方法。
Object.print = function (o) { console.log(o) };
上面代码中,print方法就是直接定义在Object对象上。
 
2)Object的实例方法
所谓“实例方法”就是定义在Object原型对象Object.prototype上的方法
它可以被Object实例直接使用。比如一些基本类型的对象。
Object.prototype.print = function () { console.log(this); };
这样使用:var obj = new Objec() ; obj.print()可直接使用
 
obj直接继承了Object.prototype的属性和方法,可以直接使用obj.print调用该方法。
也就是说,obj对象的print方法实质上就是调用Object.prototype.print方法。
 
3)作为构造函数
Object本身是一个构造函数,可以当作工具方法使用,将任意值转为对象
 
Object构造函数的首要用途,是直接通过它来生成新对象:var obj = new Object();
参数可以是任何数据
 
但是:Object(value)与new Object(value)两者的语义是不同的,
 ==》 Object(value)表示将value转成一个对象
 ==》 new Object(value)则表示新生成一个对象,它的值是value
 
instanceof运算符用来验证,一个对象是否为指定的构造函数的实例
obj instanceof Object返回true,就表示obj对象是Object的实例
 
a、静态方法
所谓“静态方法”,是指部署在Object对象自身的方法
    Object.keys()
参数是一个对象,返回该对象自身的(而不是继承的)所有(可遍历)属性名组成的数组
    Object.getOwnPropertyNames()
参数是一个对象,返回该对象自身的(而不是继承的)所有属性名组成的数组
 
注意:上面两个方法都用来遍历对象的属性。不同之处是遇到不可枚举对象时。
(1)对象属性模型的相关方法
    Object.getOwnPropertyDescriptor():获取某个属性的描述对象
    Object.defineProperty():通过描述对象,定义某个属性
    Object.defineProperties():通过描述对象,定义多个属性
(2)控制对象状态的方法
    Object.preventExtensions():防止对象扩展
    Object.isExtensible():判断对象是否可扩展
    Object.seal():禁止对象配置
    Object.isSealed():判断一个对象是否可配置
    Object.freeze():冻结一个对象
    Object.isFrozen():判断一个对象是否被冻结
(3)原型链相关方法
    Object.create():该方法可以指定原型对象和属性,返回一个新的对象
    Object.getPrototypeOf():获取对象的Prototype对象
 
b、实例方法
方法定义在Object.prototype对象。它们称为实例方法,所有Object的实例对象都继承了这些方法
 
Object实例对象的方法,主要有以下六个:
    Object.prototype.valueOf():返回当前对象对应的值,默认返回对象本身
    Object.prototype.toString():返回当前对象对应的字符串形式。
    Object.prototype.toLocaleString():返回当前对象对应的本地字符串形式。
    Object.prototype.hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。
    Object.prototype.isPrototypeOf():判断当前对象是否为另一个对象的原型。
    Object.prototype.propertyIsEnumerable():判断某个属性是否可枚举
 
这些实例方法可以被重定义的:比如:
·Object.prototype.toString() ==》返回对象类型(构造函数)字符串,常用来判断对象类型
同时,数组、字符串、函数、日期Date等对象都重定义了toString()方法
 
使用Object.prototype.toString.call(value)方法常用来判断对象的数据类型,检查对象的构造函数
你也可以自定义: obj.toString = function () { return 'hello'; };
对象在类型转化或者运算时,自动调用valueOf()和toString()方法
 
·Object.prototype.toLocaleString() ==》与toString的返回结果相同,也是返回一个值的字符串形式
但主要作用是留出一个接口,让各种不同的对象实现自己版本的方法,比如:
  Array.prototype.toLocaleString()
  Number.prototype.toLocaleString()
  Date.prototype.toLocaleString()
 
·Object.prototype.hasOwnProperty()
该方法接受一个字符串作为参数,返回一个布尔值,表示该实例对象自身是否具有该属性
字符串参数时对象的属性名,不包括继承过来的属性
 
 
2、属性描述对象
 
JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为。
比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)
每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。属性描述对象提供6个元属性。
 
1)value ==》value是该属性的属性值,默认为undefined
2)writable ==》布尔值,表示属性值(value)是否可改变(即是否可写),默认为true
3)enumerable ==》布尔值,表示该属性是否可遍历,默认为true
如果设为false,会使得某些操作(比如for...in循环、Object.keys())跳过该属性
4)configurable ==》布尔值,表示可配置性,默认为true。
如果设为false,将阻止某些操作改写该属性,比如无法删除该属性,也不得改变该属性的属性描述对象
也就是说,configurable属性控制了属性描述对象的可写性。
5)get ==》是一个函数,表示该属性的取值函数(getter),默认为undefined。
6)set ==》是一个函数,表示该属性的存值函数(setter),默认为undefined
 
也被称为:元属性
属性描述对象的各个属性称为“元属性”,因为它们可以看作是控制属性的属性
 
value ==》属性是目标属性的值
writable ==》属性是一个布尔值,决定了目标属性的值(value)是否可以被改变。
enumerable ==》(可遍历性)返回一个布尔值,表示目标属性是否可遍历。
configurable ==》(可配置性)返回一个布尔值,决定了是否可以修改属性描述对象。
也就是说,configurable为false时,value、writable、enumerable和configurable都不能被修改了
每个属性都有这样的属性描述对象:
 
存取器
除了直接定义以外,属性还可以用存取器(accessor)定义。
存值函数称为setter,使用属性描述对象的set属性;取值函数称为getter,使用属性描述对象的get属性。
 
一旦对目标属性定义了存取器,那么存取的时候,都将执行对应的函数。
利用这个功能,可以实现许多高级特性,比如某个属性禁止赋值。
注意,取值函数get不能接受参数,存值函数set只能接受一个参数(即属性的值)
 
 
{
    value: 123,
    writable: false,
    enumerable: true,
    configurable: false,
    get: undefined,
    set: undefined
}
 
·Object.getOwnPropertyDescriptor()
获取属性描述对象。第一参数是目标对象,第二参数是字符串,对应的某个属性名
只能获取自身的属性,不能获取继承的对象
 
·Object.getOwnPropertyNames()
获取对象的所有属性名,参数是目标对象。返回一个数组,
成员是参数对象自身的全部属性的属性名,不管该属性是否可遍历
 
·Object.defineProperty(),Object.defineProperties()
方法允许通过属性描述对象,定义或修改一个属性,然后返回修改后的对象
语法是:Object.defineProperty(object, propertyName, attributesObject)
 
·Object.prototype.propertyIsEnumerable()
实例对象的该方法返回一个布尔值,用来判断某个属性是否可遍历。(需要实例化的)
注意,这个方法只能用于判断对象自身的属性,对于继承的属性一律返回false
 
控制对象状态
有时需要冻结对象的读写状态,防止对象被改变。JavaScript 提供了三种冻结方法,
最弱的一种是Object.preventExtensions,其次是Object.seal,最强的是Object.freeze。
 
    Object.preventExtensions() ==》可以使得一个对象无法再添加新的属性
    Object.isExtensible() ==》检查是否可以为一个对象添加属性
    Object.seal() ==》使得一个对象既无法添加新属性,也无法删除旧属性
    Object.isSealed() ==》方法用于检查一个对象是否使用了Object.seal方法。
    Object.freeze() ==》方法可以使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值
    Object.isFrozen() ==》方法用于检查一个对象是否使用了Object.freeze方法
 
 
3、包装对象
 
对象是 JavaScript 语言最主要的数据类型,三种原始类型的值——数值、字符串、布尔值
在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”(wrapper)。
 
所谓“包装对象”,指的是与数值、字符串、布尔值分别相对应的Number、String、Boolean三个原生对象
这三个原生对象可以把原始类型的值变成(包装成)对象
 
从Object对象继承的方法:valueOf()和toString()
valueOf() ==》方法返回包装对象实例对应的原始类型的值
toString() ==》方法返回对应的字符串形式。
 
原始类型与实例对象的自动转换
某些场合,原始类型的值会自动当作包装对象调用,
即调用包装对象的属性和方法时,
JavaScript 引擎会自动将原始类型的值转为包装对象实例,并在使用后立刻销毁实例。
 
Number、String和Boolean这三个原生对象,如果不作为构造函数调用(即调用时不加new),
而是作为普通函数调用,常常用于将任意类型的值转为数值、字符串和布尔值。