Javascript内置对象(一)——String&Array
来源:互联网 发布:don t starve for mac 编辑:程序博客网 时间:2024/05/17 03:14
JavaScript有一些常见的内置对象,如String,Array,Boolean,Date,Regexp,Object,Number,Function等。这些内置对象看起来简单,实际关系异常复杂。
这些内置对象从表现形式来说很像其他语言中的类型(type)或者类(class),比如Java中的String 类。有时候说js是比java更加面向对象的语言,一点不为过。
String对象
String对象是JavaScript原生提供的三个包装对象之一,用来生成字符串的包装对象实例。
平时我们经常使用的String对象属性方法有:
- length属性:返回字符串长度
- concat:用来连接两个字符串
- substr和slice:用来截取字符串,不过截取方式不同
- indexOf:确定一个字符串在另一个字符串中的位置
- trim:用于去除字符串两端的空格
- toLowerCase 和 toUpperCase :改变字符串大小写
- repalce:用于替换匹配的子字符串,一般情况下只替换第一个匹配
- split:分割字符串,返回一个由分割出来的各部分组成的新数组。
下面分析一段代码
var str1 = 'a test string' var str2 = new String('a test string') str1.length //13 str1.indexOf('t') //2 console.log(typeof str1) //string console.log(typeof str2) //object str1 instanceof String //false str2 instanceof String //true
原始值str1 并不是一个对象,它只是一个字面量,并且是一个不可变的值。如果要在这个字面量上执行一些操作,比如获取长度、访问其中某个字符等,那需要将其转换为String 对象。
以上的内容用下面这段代码解释再好不过。
String instanceof Objectnew String('foo') instanceof String; // truenew String('foo') instanceof Object; // true'foo' instanceof String; // false'foo' instanceof Object; // false
String对象调用Array对象方法
许多数组函数用来处理字符串很方便。虽然字符串没有这些函数,但可以通过“借用”数组的非变更方法来处理字符串:
var a = 'feiyan'a.join; // undefineda.map; // undefinedvar c = Array.prototype.join.call( a, "-" );var d = Array.prototype.map.call( a, function(v){return v.toUpperCase() + ".";} ).join( "" );c; //f-e-i-y-a-nd; //F.E.I.Y.A.N.
其中的join方法和map方法都是数组对象的方法,这里字符串对象可以通过原型调用先把字符串对象转化为数字对象,然后再通过join方法变为字符串。而很多时候我们可以用[]代替Array.prototype:
Array.prototype === [].__proto__ //true
在许多方面,字符串表现的好像字符数组,许多Javascript array相关方法也可以使用在String类型上,但是并不是所有的方法都可以。看下面示例:
var name = 'feiyan'a = [].push.call(name, 'is my love girl')
报错:提示Javascript中字符串是只读的,因此任何方法想改变字符串都将失败,因此可以排除掉数组的push、pop、shift、unshift、splice、reverse方法。如果真要实现这个功能,这样这么做:
var name = 'feiyan'name.concat(' is my love girl').split()
其他一些不改变原字符串的方法(如一些遍历方法)可以随意使用:
var str1 = 'a lovely girl'var a = [].forEach.call(str1,function(ele,index,arr){ console.log(ele) })
ES6常用字符串特性
ES6为字符串添加了遍历器接口,使得字符串可以被for…of循环遍历。
for(var i of 'string'){ console.log(i)}
ES6引入了一种新型的字符串字面量语法,我们称之为模板字符串(template strings)。除了使用反撇号字符 ` 代替普通字符串的引号 ’ 或 ” 外,它们看起来与普通字符串并无二致。在最简单的情况下,它们与普通字符串的表现一致。
现在,我们看到了一个比 + 运算符更优雅的语法,下面是一些你期待的特性:
- 模板占位符可以是任何 JavaScript 表达式,所以函数调用和四则运算等都是合法的。(甚至你还可以在一个模板字符串中嵌套另一个模板字符串。)
- 如果一个值不是字符串,它将被转换为字符串。例如,如果 action 是一个对象,那么该对象的 .toString() 将被调用,来将其转换为字符串。
- 如果你想在模板字符串中使用反引号,你需要使用反斜杠 \ 将其转义。
- 同样地,如果想在模板字符串中输出 ${,也需要使用反斜杠将其转义:${ 或 ${。
- 模板字符串可以跨越多行:
$("#warning").html(` <h1>Warning Title!</h1> <p>This is some information,it is ${warning}</p>`);
Array对象
Array是JavaScript的内置对象,同时也是一个构造函数,可以用它生成新的数组。
作为构造函数时,Array可以接受参数,但是不同的参数,会使得Array产生不同的行为。
数组对象的常用方法如下:
- isArray:判断一个值是否为数组
- toString:返回数组的字符串形式
- push方法,pop方法:push方法用于在数组的末端添加一个或多个元素,并返回添加后的数组的长度,pop方法用于删除数组的最后一个元素,并返回该元素
- join:以参数作为分隔符,将所有数组成员组成一个字符串返回
- concat:将新数组的成员,添加到原数组的尾部,然后返回一个新数组,常用于连接多个数组
- shift方法,unshift方法: shift方法用于删除数组的第一个元素,并返回该元素,unshift方法用于在数组的第一个位置添加元素,并返回添加新元素后的数组长度
- reverse:用于颠倒数组中元素的顺序
- slice返回指定位置的数组成员组成的新数组,原数组不变。它的第一个参数为起始位置(从0开始),第二个参数为终止位置(但该位置的元素本身不包括在内)。如果省略第二个参数,则一直返回到原数组的最后一个成员
- sort:对数组元素进行排序,默认是按照字典顺序排序
- map:对数组的所有成员依次调用一个函数,根据函数结果返回一个新数组
- forEach:遍历数组的所有成员
- filter:依次对所有数组成员调用一个测试函数
- indexOf:返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1
Array.from
有时需要将类数组(一组通过数字索引的值)转换为真正的数组,这一般通过数组工具函数(如indexOf(..)、concat(..)、forEach(..) 等)来实现。类数组如下:
例如,一些DOM 查询操作会返回DOM 元素列表,它们并非真正意义上的数组,但十分
类似。另一个例子是通过arguments 对象(类数组)将函数的参数当作列表来访问(从
ES6 开始已废止)。
function foo() {var arr = Array.prototype.slice.call( arguments );arr.push( "bam" );console.log( arr );}foo( "bar", "baz" ); // ["bar","baz","bam"]
如上所示,slice() 返回参数列表(上例中是一个类数组)的一个数组复本。
用ES6 中的内置工具函数Array.from(..) 也能实现同样的功能:
function f() { return Array.from(arguments);}
Array.from() 方法从一个类似数组或可迭代的对象中创建一个新的数组实例。
Array.from('foo'); // ["f", "o", "o"]
Array.from方法还支持类似数组的对象。所谓类似数组的对象,本质特征只有一点,即必须有length属性。因此,任何有length属性的对象,都可以通过Array.from方法转为数组,而此时扩展运算符就无法转换。
Array.from({ length: 3 });// [ undefined, undefined, undefined ]
Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
Array.from([1, 2, 3], (x) => x * x)// [1, 4, 9]Array.from([1,2,3].map((x) => x * x))// [1, 4, 9]
find方法
数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。
[1, 5, 10, 15].find(function(value, index, arr) { return value > 9;}) // 10
数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。
fill方法
fill方法使用给定值,填充一个数组。fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。
['a', 'b', 'c'].fill(7)// [7, 7, 7]new Array(3).fill(7)// [7, 7, 7]['a', 'b', 'c'].fill(7, 1, 2)// ['a', 7, 'c']
includes方法
includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似
空位的处理
数组的空位指,数组的某一个位置没有任何值。比如,Array构造函数返回的数组都是空位。
ES5 对空位的处理,大多数情况下会忽略空位。
- forEach(), filter(), every() 和some()都会跳过空位。
- map()会跳过空位,但会保留这个值
- join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串。
// forEach方法[,'a'].forEach((x,i) => console.log(i)); // 1// filter方法['a',,'b'].filter(x => true) // ['a','b']// every方法[,'a'].every(x => x==='a') // true// some方法[,'a'].some(x => x !== 'a') // false// map方法[,'a'].map(x => 1) // [,1]// join方法[,'a',undefined,null].join('#') // "#a##"// toString方法[,'a',undefined,null].toString() // ",a,,"
ES6 则是明确将空位转为undefined。Array.from方法会将数组的空位,转为undefined,也就是说,这个方法不会忽略空位。for…of循环也会遍历空位。
Array.from(['a',,'b'])// [ "a", undefined, "b" ]let arr = [, ,];for (let i of arr) { console.log(1);}// 1// 1
数组arr有两个空位,for…of并没有忽略它们。如果改成map方法遍历,空位是会跳过的。
- Javascript内置对象(一)——String&Array
- JavaScript内置对象——Array方法
- javascript内置对象Array
- JavaScript对象(一) --- String, Date, Array
- javascript 内置对象 - String
- javaScript内置对象String
- javascript内置对象(一)
- JavaScript 内置对象(一):Array 对象(构造函数、属性和方法)
- JavaScript 内置对象(一):Array 对象(构造函数、属性和方法)
- JavaScript基础(DOM)-Document对象、Element 对象、Attribute 对象 -JavaScript的内置对象(Array 对象、Date 对象、String 对象)
- javaScript 内置对象六 (Array)
- JavaScript—内置对象
- JavaScript—内置对象
- JavaScript第三章知识点总结——String内置对象
- JavaScript第三章知识点总结——String内置对象
- JavaScript内置对象-string对象
- W3Cschool——学习二:JavaScript对象,String,Date,Array
- javascript(一) JavaScript之Array对象
- 架构选型之Nodejs与Java
- [51nod1355]斐波那契的最小公倍数
- 边框覆盖问题
- windows 平台下 Bundler 源程序代码
- C++函数
- Javascript内置对象(一)——String&Array
- Zookeeper的安装配置和常用命令
- 面向对象的命名空间总结
- HTML5 canvas时钟钟表!
- breed Web刷机升级详细教材修正编译器固件说明_itkeji.top
- linux shell编程时报:bad substitution错误的解决办法
- 6174的问题
- 从Java的equals和==初识面向对象
- redis的主从复制机制