字符串API
前言:字符串的操作也尤为重要。以下简单列出了一些常用的字符串操作API,具体的解释可见http://louiszhai.github.io/2016/01/12/js.String/,对String构造器和原型字符串的方法都有详细的介绍。
一、String构造器方法(点击可查看对应原网页)
- fromCharCode 传入Unicode序列,返回基于此创建的字符串。
- fromCodePoint(ES6) 作用和语法同fromCharCode方法,主要扩展了对4字节字符的支持。
- raw(ES6) 是一个模板字符串的标签函数,用来获取一个模板字符串的原始字面量。
String.prototype : 和其他所有对象一样,字符串实例的所有方法均来自String.prototype
二、字符串原型方法(点击可查看对应原网页案例)(带下划线为最常见的)
字符串原型方法分为两种,一种是html无关的方法,一种是html有关的方法。我们先看第一种。所有字符串方法都不可以改变原字符串。
HTML无关的方法
- charAt 返回字符串中指定位置的字符 str.charAt(index)
- charCodeAt 返回指定索引处字符的 Unicode 数值
- concat 将一个或多个字符串拼接在一起,组成新的字符串并返回
- indexOf 查找子字符串在字符串中首次出现的位置,没有则返回 -1。该方法严格区分大小写,并且从左往右查找
- lastIndexOf lastIndexOf 则从右往左查找,其它与前者一致
- localeCompare 比较字符串,如果指定字符串在原字符串的前面则返回负数,否则返回正数或0,其中0 表示两个字符串相同
- match 测试字符串是否支持指定正则表达式的规则
- replace 替换,更深层用法可见 http://louiszhai.github.io/2015/12/11/js.replace/
- search 测试字符串对象是否包含某个正则匹配,相当于正则表达式的 test 方法,且该方法比 match() 方法更快。search() 返回正则表达式在字符串中首次匹配项的索引,否则返回-1
- slice 提取字符串的一部分,并返回新的字符串
- split 把原字符串分割成子字符串组成数组,并返回该数组
- substr 返回字符串指定位置开始的指定数量的字符
- substring 返回字符串两个索引之间的子串。
- toLocaleLowerCase 返回调用该方法的字符串被转换成小写的值,本地映射规则
- toLocaleUpperCase 转换成大写的值
- toLowerCase 将字符串转换为相应的小写
- toUpperCase 将字符串转换为相应的大写
- toString 返回字符串本身
- valueOf 返回字符串本身
- trim 清除字符串首尾的空白并返回
- codePointAt(ES6) 返回使用UTF-16编码的给定位置的值的非负整数。
- includes(ES6) 判断一个字符串是否属于另一个字符。如果是,则返回true,否则返回false。
- endsWith(ES6) 判断一个字符串是否是原字符串的结尾。若是则返回true,否则返回false。
- normalize(ES6) 按照指定的 Unicode 正规形式将原字符串正规化。
- repeat(ES6) 返回重复原字符串多次的新字符串
- startsWith(ES6) 判断当前字符串是否是以给定字符串开始的,若是则返回true,否则返回false。
HTML有关的方法
对象API
前言:对象的操作也很常见。以下简单列出了一些常用的对象操作API,具体的解释可见https://segmentfault.com/a/1190000010753942,对String构造器和原型字符串的方法都有详细的介绍。这里只罗列一些最常用的。
创建对象的两种方式:
var o = new Object(); var o = {}; // 推荐
一、Object构造器的成员
Object.prototype 该属性是所有对象的原型(包括 Object对象本身),语言中的其他对象正是通过对该属性上添加东西来实现它们之间的继承关系的。所以要小心使用。
二、Object.prototype 的成员
举例:
Object.prototype.constructor === Object; // true var o = new Object(); // var 0 = {} 也一样的结果 o.constructor === Object; // true 不带 .prototype.
1 .constructor 指向用来构造该函数对象的构造器,在这里为Object()
2 .toString(radix) 返回的是一个用于描述目标对象的字符串。特别地,当目标是一个Number对象时,可以传递一个用于进制数的参数radix,该参数radix,该参数的默认值为10。
3 .toLocaleString() 与toString()基本相同,只不过它做一些本地化处理
4 .valueOf() 返回的是用基本类型所表示的this值,如果它可以用基本类型表示的话。如果Number对 象返回的是它的基本数值,而Date对象返回的是一个时间戳(timestamp)。如果无法用基本数据类型表示,该方法会返回this本身。
5 .hasOwnProperty(prop) 仅在目标属性为对象自身属性时返回true,而当该属性是从原型链中继承而来或根本不存在时,返回false。
6 .isPrototypeOf(obj) 如果目标对象是当前对象的原型,该方法就会返回true,而且,当前对象所在原型上的所有对象都能通过该测试,并不局限与它的直系关系。
7 .propertyIsEnumerable(prop) 如果目标属性能在for in循环中被显示出来,该方法就返回true
三、在ES5中附加的Object属性
在ES5中,我们可以设置属性是否可以被改变或是被删除——在这之前,它是内置属性的特权。ES5中引入了属性描述符的概念,我们可以通过它对所定义的属性有更大的控制权。这些属性描述符(特性)包括:value的默认值为undefined以外,其他的默认值都为false
value——当试图获取属性时所返回的值。
writable——该属性是否可写。
enumerable——该属性在for in循环中是否会被枚举
configurable——该属性是否可被删除。
set()——该属性的更新操作所调用的函数。
get()——获取属性值时所调用的函数。
ES3风格的属性定义方式:
var person = {}; person.legs = 2;
以下是等价的ES5通过数据描述符定义属性的方式:
(使用Object.defineProperty(obj, prop, descriptor),参数为属性,值,属性描述 )
var person = {}; Object.defineProperty(person, 'legs', { value: 2, writable: true, configurable: true, enumerable: true });
基上,对象属性操作还有如下API(案例见https://segmentfault.com/a/1190000010753942)
1、Object.defineProperty(obj, prop, descriptor) 如上
2、Object.defineProperties(obj, props) 与defineProperty()基本相同,只不过它可以用来一次定义多个属性
3、Object.getPrototypeOf(obj) 给定的对象的原型
4、Object.create(obj, descr) 主要用于创建一个新对象,并为其设置原型,用(上述)属性描述符来定义对象的原型属性
5、Object.getOwnPropertyDesciptor(obj, property) 详细查看一个属性的定义。甚至可以通过它一窥那些内置的,之前不可见的隐藏属性
6、Object.getOwnPropertyNames(obj) 该方法返回一个数组,其中包含了当前对象所有属性的名称(字符串),不论它们是否可枚举。当然,也可以用Object.keys()来单独返回可枚举的属性。
7、Object.preventExtensions(obj) 禁止向某一对象添加更多属性
8、Object.isExtensible(obj) 检查某对象是否还可以被添加属性。
9、Object.seal(obj) 让一个对象密封,并返回被密封后的对象。现有属性
设置成不可配置,只能变更现有属性的值
10、Object.isSeal(obj) 检查某对象是否密封
11、Object.freeze(obj) 这个对象永远是不可变的
12、Object.keys(obj) 该方法是一种特殊的for-in循环。它只返回当前对象的属性(不像for-in),而且这些属性也必须是可枚举的(这点和Object.getOwnPropertyNames()不同,不论是否可以枚举)。返回值是一个字符串数组。
四、在ES6中附加的Object属性
1、Object.is(value1, value2) 用来比较两个值是否严格相等。它与严格比较运算符(===)的行为基本一致
2、Object.assign(target, ...sources) 用来源对象(source)的所有可枚举的属性复制到目标对象(target)。它至少需要两个对象作为参数,第一个参数是目标对象target,后面的参数都是源对象(source)。只有一个参数不是对象,就会抛出TypeError错误。
var target = {a: 1}; var source1 = {b: 2}; var source2 = {c: 3}; obj = Object.assign(target, source1, source2); target; // {a:1,b:2,c:3} obj; // {a:1,b:2,c:3} target === obj; // true // 如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。 var source3 = {a:2,b:3,c:4}; Object.assign(target, source3); target; // {a:2,b:3,c:4}
3、Object.getOwnPropertySymbols(obj) 会返回一个数组,该数组包含了指定对象自身的(非继承的)所有 symbol 属性键
4、Object.setPrototypeOf(obj, prototype) 设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null。
__proto__属性用来读取或设置当前对象的prototype对象。目前,所有浏览器(包括IE11)都部署了这个属性。
五、在ES8中附加的Object属性
1、Object.getOwnPropertyDescriptors(obj) 可以用来获取一个对象的所有自身属性的描述符。
2、Object.values(obj) 返回一个给定对象自己的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于for-in循环枚举原型链中的属性 )。
3、Object.entries(obj) 返回一个给定对象自己的可枚举属性[key,value]对的数组,数组中键值对的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致(区别在于一个for-in循环也枚举原型链中的属性)。