JS粗读笔记(乱七八糟一锅炖版三)

包装对象实例的方法
包装对象实例可以使用Object对象提供的原生方法,主要是 valueOf方法和 toString方法。
valueOf()
valueOf方法返回包装对象实例对应的原始类型的值。
new Number(123).valueOf()  // 123new String("abc").valueOf() // "abc"new Boolean("true").valueOf() // true

toString()
toString方法返回实例对应的字符串形式。
new Number(123).toString() // "123"new String("abc").toString() // "abc"new Boolean("true").toString() // "true"



三种包装对象还可以在原型上添加自定义方法和属性,供原始类型的值直接调用。
但是,这种自定义方法和属性的机制,只能定义在包装对象的原型上,如果直接对原始类型的变量添加属性,则无效。
注意, false对应的包装对象实例,布尔运算结果也是 true
使用双重的否运算符( !)也可以将任意值转为对应的布尔值。

Number对象
Number对象部署了自己的 toString方法,用来将一个数值转为字符串形式。
toString方法可以接受一个参数,表示输出的进制。如果省略这个参数,默认将数值先转为十进制,再输出字符串;否则,就根据参数指定的进制,将一个数字转化成某个进制的字符串。
(10).toString(2) // "1010"(10).toString(8) // "12"(10).toString(16) // "a"

上面代码中,之所以要把10放在括号里,是为了表明10是一个单独的数值,后面的点表示调用对象属性。如果不加括号,这个点会被JavaScript引擎解释成小数点,从而报错。
这实际上意味着,可以直接对一个小数使用 toString方法。
10.5.toString() // "10.5"10.5.toString(2) // "1010.1"10.5.toString(8) // "12.4"10.5.toString(16) // "a.8"

将其他进制的数,转回十进制,需要使用 parseInt 方法。 parseInt 方法可以接受第二个参数(2到36之间),表示被解析的值的进制,返回该值对应的十进制数

Number.prototype.toFixed()
toFixed方法用于将一个数转为指定位数的小数,返回这个小数对应的字符串。
(10).toFixed(2) // "10.00"10.005.toFixed(2) // "10.01

toFixed 方法的参数为指定的小数位数,有效范围为0到20,超出这个范围将抛出RangeError错误。
Number.prototype.toExponential()
toExponential方法用于将一个数转为科学计数法形式。
(10).toExponential()  // "1e+1"(10).toExponential(1) // "1.0e+1"(10).toExponential(2) // "1.00e+1"(1234).toExponential()  // "1.234e+3"(1234).toExponential(1) // "1.2e+3"(1234).toExponential(2) // "1.23e+3"

toExponential 方法的参数表示小数点后有效数字的位数,范围为0到20,超出这个范围,会抛出一个RangeError。
Number.prototype.toPrecision()
toPrecision方法用于将一个数转为指定位数的有效数字。
(12.34).toPrecision(1) // "1e+1"(12.34).toPrecision(2) // "12"(12.34).toPrecision(3) // "12.3"(12.34).toPrecision(4) // "12.34"(12.34).toPrecision(5) // "12.340"

toPrecision 方法的参数为有效数字的位数,范围是1到21,超出这个范围会抛出RangeError错误。
toPrecision方法用于四舍五入时不太可靠,跟浮点数不是精确储存有关。

String对象
String.fromCharCode()
String对象提供的静态方法(即定义在对象本身,而不是定义在对象实例的方法),主要是 fromCharCode()。该方法的参数是一系列Unicode码点,返回对应的字符串。
String.fromCharCode(104, 101, 108, 108, 111)// "hello"

charAt()
charAt方法返回指定位置的字符,参数是从 0开始编号的位置。
如果参数为负数,或大于等于字符串的长度, charAt返回空字符串。
charCodeAt()
charCodeAt方法返回给定位置字符的Unicode码点(十进制表示),相当于 String.fromCharCode()的逆操作。
如果参数为负数,或大于等于字符串的长度, charCodeAt返回 NaN
concat()
concat方法用于连接两个字符串,返回一个新字符串,不改变原字符串。
var s1 = 'abc';var s2 = 'def';s1.concat(s2) // "abcdef"s1 // "abc"

该方法可以接受多个参数。
如果参数不是字符串, concat方法会将其先转为字符串,然后再连接。
slice()
slice方法用于从原字符串取出子字符串并返回,不改变原字符串。
它的第一个参数是子字符串的开始位置,第二个参数是子字符串的结束位置(不含该位置)。
'JavaScript'.slice(0, 4) // "Java"

如果省略第二个参数,则表示子字符串一直到原字符串结束。
如果参数是负值,表示从结尾开始倒数计算的位置,即该负值加上字符串长度。
'JavaScript'.slice(-6) // "Script"'JavaScript'.slice(0, -6) // "Java"'JavaScript'.slice(-2, -1) // "p"

如果第一个参数大于第二个参数, slice 方法返回一个空字符串。
'JavaScript'.slice(2, 1) // ""

substring()
substring方法用于从原字符串取出子字符串并返回,不改变原字符串。它与 slice作用相同,但有一些奇怪的规则,因此不建议使用这个方法,优先使用 slice
如果第二个参数大于第一个参数, substring方法会自动更换两个参数的位置。
如果参数是负数, substring方法会自动将负数转为0。
substr()
substr方法用于从原字符串取出子字符串并返回,不改变原字符串。
substr方法的第一个参数是子字符串的开始位置,第二个参数是子字符串的长度。
'JavaScript'.substr(4, 6) // "Script"

如果省略第二个参数,则表示子字符串一直到原字符串的结束。
'JavaScript'.substr(4) // "Script"

如果第一个参数是负数,表示倒数计算的字符位置。如果第二个参数是负数,将被自动转为0,因此会返回空字符串。
'JavaScript'.substr(-6) // "Script"'JavaScript'.substr(4, -1) // ""

上面代码的第二个例子,由于参数 -1 自动转为 0 ,表示子字符串长度为0,所以返回空字符串。
indexOf(),lastIndexOf()
这两个方法用于确定一个字符串在另一个字符串中的位置,都返回一个整数,表示匹配开始的位置。如果返回 -1,就表示不匹配。两者的区别在于, indexOf从字符串头部开始匹配, lastIndexOf从尾部开始匹配。
trim()
trim方法用于去除字符串两端的空格,返回一个新字符串,不改变原字符串。
toLowerCase(),toUpperCase()
toLowerCase方法用于将一个字符串全部转为小写, toUpperCase则是全部转为大写。它们都返回一个新字符串,不改变原字符串。
localeCompare方法用于比较两个字符串。它返回一个整数,如果小于0,表示第一个字符串小于第二个字符串;如果等于0,表示两者相等;如果大于0,表示第一个字符串大于第二个字符串。
'apple'.localeCompare('banana')// -1'apple'.localeCompare('apple')// 0

该方法中,大写字母大于小写字母
match()
match方法用于确定原字符串是否匹配某个子字符串,返回一个数组,成员为匹配的第一个字符串。如果没有找到匹配,则返回 null
'cat, bat, sat, fat'.match('at') // ["at"]'cat, bat, sat, fat'.match('xt') // null

返回数组还有 index 属性和 input 属性,分别表示匹配字符串开始的位置和原始字符串。
var matches = 'cat, bat, sat, fat'.match('at');matches.index // 1matches.input // "cat, bat, sat, fat"<strong>
</strong>

replace()
replace方法用于替换匹配的子字符串,一般情况下只替换第一个匹配(除非使用带有 g修饰符的正则表达式),该方法不影响原字符串。
'aaa'.replace('a', 'b') // "baa"
split()
split方法按照给定规则分割字符串,返回一个由分割出来的子字符串组成的数组。
如果满足分割规则的两个部分紧邻着(即中间没有其他字符),则返回数组之中会有一个空字符串。
如果满足分割规则的部分处于字符串的开头或结尾(即它的前面或后面没有其他字符),则返回数组的第一个或最后一个成员是一个空字符串。
'|b|c'.split('|') // ["", "b", "c"]'a|b|'.split('|') // ["a", "b", ""]

split 方法还可以接受第二个参数,限定返回数组的最大成员数。
'a|b|c'.split('|', 0) // []'a|b|c'.split('|', 1) // ["a"]'a|b|c'.split('|', 2) // ["a", "b"]'a|b|c'.split('|', 3) // ["a", "b", "c"]'a|b|c'.split('|', 4) // ["a", "b", "c"]

上面代码中, split 方法的第二个参数,决定了返回数组的成员数。
Math对象
Math是JavaScript的内置对象,提供一系列数学常数和数学方法。该对象不是构造函数,不能生成实例,所有的属性和方法都必须在 Math对象上调用。
Math对象提供以下一些只读的数学常数。
  • Math.E:常数e。
  • Math.LN2:2的自然对数。
  • Math.LN10:10的自然对数。
  • Math.LOG2E:以2为底的e的对数。
  • Math.LOG10E:以10为底的e的对数。
  • Math.PI:常数Pi。
  • Math.SQRT1_2:0.5的平方根。
  • Math.SQRT2:2的平方根。
Math对象提供以下一些数学方法。
  • Math.abs():绝对值
  • Math.ceil():向上取整
  • Math.floor():向下取整
  • Math.max():最大值
  • Math.min():最小值
  • Math.pow():指数运算
  • Math.sqrt():平方根
  • Math.log():自然对数
  • Math.exp():e的指数
  • Math.round():四舍五入
  • Math.random():随机数
Math对象还提供一系列三角函数方法。
  • Math.sin():返回参数的正弦
  • Math.cos():返回参数的余弦
  • Math.tan():返回参数的正切
  • Math.asin():返回参数的反正弦(弧度值)
  • Math.acos():返回参数的反余弦(弧度值)
  • Math.atan():返回参数的反正切(弧度值)

Date对象
Date(2000, 1, 1)// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"

上面代码说明,无论有没有参数,直接调用 Date 总是返回当前时间。
Date还可以当作构造函数使用。对它使用 new命令,会返回一个 Date对象的实例。如果不加参数,生成的就是代表当前时间的对象。
var today = new Date();

这个 Date 实例对应的字符串值,就是当前时间。
Date.now()
Date.now方法返回当前距离1970年1月1日 00:00:00 UTC的毫秒数(Unix时间戳乘以1000)
Date.parse()
Date.parse方法用来解析日期字符串,返回距离1970年1月1日 00:00:00的毫秒数。
标准的日期字符串的格式,应该完全或者部分符合RFC 2822和ISO 8061,即 YYYY-MM-DDTHH:mm:ss.sssZ格式,其中最后的 Z表示时区。但是,其他格式也可以被解析,如果解析失败,返回 NaN
Date.UTC()
默认情况下,Date对象返回的都是当前时区的时间。 Date.UTC方法可以返回UTC时间(世界标准时间)。该方法接受年、月、日等变量作为参数,返回当前距离1970年1月1日 00:00:00 UTC的毫秒数



JSON格式
JSON格式(JavaScript Object Notation的缩写)是一种用于数据交换的文本格式,2001年由Douglas Crockford提出,目的是取代繁琐笨重的XML格式
简单说,每个JSON对象,就是一个值。要么是简单类型的值,要么是复合类型的值,但是只能是一个值,不能是两个或更多的值。这就是说,每个JSON文档只能包含一个值。
JSON对值的类型和格式有严格的规定。
  1. 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
  2. 简单类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity, -Infinityundefined)。
  3. 字符串必须使用双引号表示,不能使用单引号。
  4. 对象的键名必须放在双引号里面。
  5. 数组或对象最后一个成员的后面,不能加逗号

以下是合格的JSON值。
["one", "two", "three"]{ "one": 1, "two": 2, "three": 3 }{"names": ["张三", "李四"] }[ { "name": "张三"}, {"name": "李四"} ]

需要注意的是,空数组和空对象都是合格的JSON值, null 本身也是一个合格的JSON值。
ES5新增了 JSON对象,用来处理JSON格式数据。它有两个方法: JSON.stringify()JSON.parse()
JSON.stringify()
JSON.stringify方法用于将一个值转为字符串。该字符串应该符合JSON格式,并且可以被 JSON.parse方法还原
如果原始对象中,有一个成员的值是 undefined、函数或XML对象,这个成员会被省略。如果数组的成员是 undefined、函数或XML对象,则这些值被转成 null
正则对象会被转成空对象。
JSON.stringify方法会忽略对象的不可遍历属性。

JSON.stringify方法还可以接受一个数组,作为第二个参数,指定需要转成字符串的属性。
var obj = {  'prop1': 'value1',  'prop2': 'value2',  'prop3': 'value3'};var selectedProperties = ['prop1', 'prop2'];JSON.stringify(obj, selectedProperties)// "{"prop1":"value1","prop2":"value2"}"

上面代码中, JSON.stringify 方法的第二个参数指定,只转 prop1 prop2 两个属性。
这个类似“白名单”的数组,只对对象的属性有效,对数组无效。
第二个参数还可以是一个函数,用来更改 JSON.stringify的默认行为。
function f(key, value) {  if (typeof value === "number") {    value = 2 * value;  }  return value;}JSON.stringify({ a: 1, b: 2 }, f)// '{"a": 2,"b": 4}'

上面代码中的 f 函数,接受两个参数,分别是被转换的对象的键名和键值。如果键值是数值,就将它乘以 2 ,否则就原样返回。
注意,这个处理函数是递归处理所有的键。

第三个参数
JSON.stringify还可以接受第三个参数,用于增加返回的JSON字符串的可读性。如果是数字,表示每个属性前面添加的空格(最多不超过10个);如果是字符串(不超过10个字符),则该字符串会添加在每行前面。
JSON.stringify({ p1: 1, p2: 2 }, null, 2);/*"{  "p1": 1,  "p2": 2}"*/JSON.stringify({ p1:1, p2:2 }, null, '|-');/*"{|-"p1": 1,|-"p2": 2}"*/


toJSON 方法
如果 JSON.stringify方法处理的对象,包含一个 toJSON方法,则它会使用这个方法得到一个值,然后再将这个值转成字符串,而忽略其他成员。
Date对象就部署了一个自己的 toJSON方法。
JSON.parse()
JSON.parse方法用于将JSON字符串转化成对象。
JSON.parse('{}') // {}JSON.parse('true') // trueJSON.parse('"foo"') // "foo"JSON.parse('[1, 5, "false"]') // [1, 5, "false"]JSON.parse('null') // nullvar o = JSON.parse('{"name": "张三"}');o.name // 张三


如果传入的字符串不是有效的JSON格式, JSON.parse方法将报错。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值