
直接量时指不需要创立对象即可以直接使用的变量。ES中的直接量主要有三种类型:表示字符串的string类型、表示数字的number类型和表示true/false的boolean类型。当我们直接将值赋给变量后,ES就会自动判断其类型,而且当参数发生变化后,其类型也会自动跟着变化,即ES时一种弱类型的语言。
直接量直接使用两块内存来保存它们的名值对,而不像对象类型需要3块内存。
直接量属性和对象属性的内存模型ES中有一种叫做自动封包/解包的功能,相似.net/java中的装箱/拆箱,其作用时在程序执行过程中按照需要自动在直接量和其对象的对象类型间进行转化。将直接量转换为对应的对象进行解决叫封包,反过来,将对象转换为直接量叫解包。
代码示例:
var m = new Number(5);var n = m + 2;console.log(n); // 7console.log(typeof m); // objectconsole.log(typeof n); // number
直接量所对应的对象叫做包装对象,string、number、boolean所对应的包装对象分别是String、Number、Boolean对象。它们都是function类型的对象。
一个对象最重要的就是它所包含的属性,而function对象的属性又分为两大类,一类是它自身的属性,另一类是它所创立的object类型实例对象的属性,创立的实例对象的属性又分为实例自己的属性和function的prototype的属性。
String对象是function类型的对象,对应的是字符串类型,可用来创立字符串类型的object类型,例如: new String('abc');
String类型自身只有两个属性,一个prototype,另一个是fromCharCode。fromCharCode方法的作用是创立由Unicode值所对应的字符组成的字符串,需要一个或者多个参数。
代码示例:
var s = String.fromCharCode(97,98,99);console.log(s); // abc
var s = new String('Hello World');console.log(s.toString()); // Hello Worldvar s = new String('Hello World');console.log(s.valueOf()); // Hello Worldvar s = new String('Hello World');console.log(s.charAt(3)); // lvar s = new String('aHello World');console.log(s.charCodeAt(0)); // 97var s = 'hello';var s1 = s.concat(' world');console.log(s1); // hello worldvar s = 'hello world';console.log(s.indexOf('l')); // 2console.log(s.indexOf('or')); // 7var s = 'hello world';console.log(s.lastIndexOf('l')); // 9, 注意:这里是9, 下面的是3console.log(s.lastIndexOf('l', 3)); // 3console.log('a'.localeCompare('b')); // -1console.log('b'.localeCompare('a')); // 1console.log('a'.localeCompare('a')); // 0console.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')); // bEneficialconsole.log(a.replace(/e/, 'E')); // bEneficialconsole.log(a.replace(/e/g, 'E')); // bEnEficialvar s = 'hello ECMAScritpt';console.log(s.slice(6, 10)); // ECMAconsole.log(s.slice(6, -7)); // ECMAconsole.log(s.slice(6)); // ECMAScritptvar s = 'hello ECMAScritpt';console.log(s.substring(6, 10)); // ECMAconsole.log(s.substring(10, 6)); // ECMAconsole.log(s.substring(6)); // ECMAScritptconsole.log(s.substring(-5)); // hello ECMAScritptvar 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 worldvar s = 'Hello World';console.log(s.toLocaleLowerCase()); // hello worldtoUpperCase/toLocaleUpperCase: 同转换小写的方式,将字符串转换成大写。
trim: 去掉字符串头部和尾部的空格:
代码示例:
var s = ' Hello World ';console.log(s.trim()); // Hello Worldvar s = new String('Hello World');console.log(s.length); // 11console.log(s[0]); // HNumber对象是function类型的对象,对应的是数字类型,可用来创立数字类型的object对象。
var n = 11;console.log(n.toString()); // 11console.log(n.toString(2)); // 1011console.log((255).toString(16)); //ffvar n = 5201314; console.log(n.toLocaleString()); // 5,201,314console.log(n.toLocaleString('zh-Hans-CN-u-nu-hanidec')); // 五,二〇一,三一四var n = new Number(520);console.log(typeof n); // objectconsole.log(typeof n.valueOf()); // numberconsole.log(123.456.toFixed()); // 123console.log(123.456.toFixed(2)); // 123.46console.log(123.456.toFixed(5)); // 123.45600console.log(13.14e5.toFixed(6)); // 1314000.00000console.log(123.456.toExponential()); // 1.23456e+2console.log(123.456.toExponential(2)); // 1.23e+2console.log(123.456.toPrecision(4)); // 123.5console.log(123.456.toPrecision(2)); // 1.2e+2Number创立的实例对象没有自己的命名属性。
Boolean对象是function类型的对象,对应的是布尔类型,可用来创立布尔类型的object实例对象。
只有一个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()); // trueconsole.log(typeof b); // objectconsole.log(typeof b.toString()); // stirngconsole.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