让前端飞Web前端之路编程语言爱好者

《JS原理、方法与实践》- 直接量及其相关对象

2020-05-07  本文已影响0人  张中华

直接量时指不需要创建对象就可以直接使用的变量。ES中的直接量主要有三种类型:表示字符串的string类型、表示数字的number类型和表示true/false的boolean类型。当我们直接将值赋给变量后,ES就会自动判断其类型,而且当参数发生变化后,其类型也会自动跟着变化,即ES时一种弱类型的语言。
直接量直接使用两块内存来保存它们的名值对,而不像对象类型需要3块内存。


直接量属性和对象属性的内存模型

直接量的封包与解包

ES中有一种叫做自动封包/解包的功能,类似.net/java中的装箱/拆箱,其作用时在程序执行过程中按照需要自动在直接量和其对象的对象类型间进行转化。将直接量转换为对应的对象进行处理叫封包,反过来,将对象转换为直接量叫解包。

代码示例:

var m = new Number(5);
var n = m + 2;

console.log(n); // 7
console.log(typeof m); // object
console.log(typeof n); // number

直接量的包装对象

直接量所对应的对象叫做包装对象,string、number、boolean所对应的包装对象分别是String、Number、Boolean对象。它们都是function类型的对象。
一个对象最重要的就是它所包含的属性,而function对象的属性又分为两大类,一类是它自身的属性,另一类是它所创建的object类型实例对象的属性,创建的实例对象的属性又分为实例自己的属性和function的prototype的属性。

String对象

String对象是function类型的对象,对应的是字符串类型,可用来创建字符串类型的object类型,例如: new String('abc');

String自身的属性

String类型自身只有两个属性,一个prototype,另一个是fromCharCode。fromCharCode方法的作用是创建由Unicode值所对应的字符组成的字符串,需要一个或多个参数。
代码示例:

var s = String.fromCharCode(97,98,99);
console.log(s); // abc
String.prototype中的属性
var s = new String('Hello World');
console.log(s.toString()); // Hello World
var s = new String('Hello World');
console.log(s.valueOf()); // Hello World
var s = new String('Hello World');
console.log(s.charAt(3)); // l
var s = new String('aHello World');
console.log(s.charCodeAt(0)); // 97
var s = 'hello';
var s1 = s.concat(' world');
console.log(s1); // hello world
var s = 'hello world';

console.log(s.indexOf('l')); // 2
console.log(s.indexOf('or')); // 7
var s = 'hello world';

console.log(s.lastIndexOf('l')); // 9, 注意:这里是9, 下面的是3
console.log(s.lastIndexOf('l', 3)); // 3
console.log('a'.localeCompare('b')); // -1
console.log('b'.localeCompare('a')); // 1
console.log('a'.localeCompare('a')); // 0
console.log('hello javaScript'.match('Script')); // ["Script"]
console.log('hello'.match('Script')); // null 
console.log('hello javaScript'.match(/script/i)); // ["Script"]
console.log('hello javaScript'.match(/a+/g)); // ['a','a']
var a = 'beneficial';

console.log(a.replace('e', 'E')); // bEneficial
console.log(a.replace(/e/, 'E')); // bEneficial
console.log(a.replace(/e/g, 'E')); // bEnEficial
var s = 'hello ECMAScritpt';
console.log(s.slice(6, 10)); // ECMA
console.log(s.slice(6, -7)); // ECMA
console.log(s.slice(6)); // ECMAScritpt
var s = 'hello ECMAScritpt';
console.log(s.substring(6, 10)); // ECMA
console.log(s.substring(10, 6)); // ECMA
console.log(s.substring(6)); // ECMAScritpt
console.log(s.substring(-5)); // hello ECMAScritpt
var s = 'hello world';
console.log(s.split(" ")); // [ 'hello', 'world' ]
console.log(s.split(" ", 1)); // [ 'hello' ]
console.log(s.split()); // [ 'hello world' ]
var s = 'Hello World';
console.log(s.toLowerCase()); // hello world
var s = 'Hello World';
console.log(s.toLocaleLowerCase()); // hello world
var s = ' Hello World    ';
console.log(s.trim()); // Hello World
String创建的对象实例的属性
var s = new String('Hello World');
console.log(s.length); // 11
console.log(s[0]); // H

Numver对象

Number对象是function类型的对象,对应的是数字类型,可用来创建数字类型的object对象。

Number自身的属性
Number.prototype属性
var n = 11;
console.log(n.toString()); // 11
console.log(n.toString(2)); // 1011
console.log((255).toString(16)); //ff
var n = 5201314; 
console.log(n.toLocaleString()); // 5,201,314
console.log(n.toLocaleString('zh-Hans-CN-u-nu-hanidec')); // 五,二〇一,三一四
var n = new Number(520);
console.log(typeof n); // object
console.log(typeof n.valueOf()); // number
console.log(123.456.toFixed()); // 123
console.log(123.456.toFixed(2)); // 123.46
console.log(123.456.toFixed(5)); // 123.45600
console.log(13.14e5.toFixed(6)); // 1314000.00000
console.log(123.456.toExponential()); // 1.23456e+2
console.log(123.456.toExponential(2)); // 1.23e+2
console.log(123.456.toPrecision(4)); // 123.5
console.log(123.456.toPrecision(2)); // 1.2e+2
Number创建的示例对象的属性

Number创建的实例对象没有自己的命名属性。

Boolean对象

Boolean对象是function类型的对象,对应的是布尔类型,可用来创建布尔类型的object实例对象。

Boolean自身的属性

只有一个prototype属性

Boolean.prototype的属性

Boolean的prototype一共有三个属性: constructor、toString和valueOf。constructor指向Boolean本身,toString和valueOf都返回实例对象的值,但它们类型不一样,toString返回的string类型,而valueOf返回boolean类型。
代码示例:

var b = new Boolean(true);

console.log(b.toString());  // 'true'
console.log(b.valueOf()); // true

console.log(typeof b); // object
console.log(typeof b.toString()); // stirng
console.log(typeof b.valueOf()); // boolean
多知道点: 如何在浏览器中产看对象的属性

代码示例:

// 获取String对象自身的属性
console.log(Object.getOwnPropertyNames(String));
// ["length", "name", "prototype", "fromCharCode", "fromCodePoint", "raw"]


// 获取String的prototype的属性
console.log(Object.getOwnPropertyNames(String.prototype));
// ["length", "constructor", "anchor", "big", "blink", "bold", "charAt", "charCodeAt", 
// "codePointAt", "concat", "endsWith", "fontcolor", "fontsize", "fixed", "includes", 
// "indexOf", "italics", "lastIndexOf", "link", "localeCompare", "match", "matchAll", 
// "normalize", "padEnd", "padStart", "repeat", "replace", "search", "slice", "small", 
// "split", "strike", "sub", "substr", "substring", "sup", "startsWith", "toString", 
// "trim", "trimStart", "trimLeft", "trimEnd", "trimRight", "toLocaleLowerCase", 
// "toLocaleUpperCase", "toLowerCase", "toUpperCase", "valueOf"]

// 获取String创建的对象实例的属性
console.log(Object.getOwnPropertyNames(new String()));
// ["length"]

如果觉得文章写得还行,请点个赞。如果想与我进一步交流,可以关注我的公众号或者加我的微信。

个人微信
公众号_前端微说.jpg
上一篇 下一篇

猜你喜欢

热点阅读