JavaScript中string类型是引用类型还是基本类型

JavaScript017

JavaScript中string类型是引用类型还是基本类型,第1张

基本类型在内存中具有固定的大小,而引用类型则不同。例如,对象可以具有任意的长度,无固定大小。数组也是。

基本类型变量存的是数据的具体值,而引用类型变量保存的是值的引用。

因此数值、布尔值、null和未定义(undefined)都属于基本类型。对象、数组和函数则属于引用类型。

string类型有些特殊,因为字符串具有可变的大小,所以显然它不能被直接存储在具有固定大小的变量中。由于效率的原因,我们希望JS只复制对字符串的引用,而不是字符串的内容。但是另一方面,字符串在许多方面都和基本类型的表现相似,而字符串是不可变的这一事实(即没法改变一个字符串值的内容),因此可以将字符串看成

行为与基本类型相似的不可变引用类型

js中的基础类型有6种

5种基础类型:undefined null String Number Boolean

1中引用类型:Object

基础类型的string有如下定义方式:

这三种方式有什么区别吗?

str1、str2是普通的字符串,str3是个对象?什么原因呢?

用 typeof 验证一下

用 instanceof 验证一下

可以看出 str3 确确实实是个String对象了

再来看个有意思的事,如果给String加上自定义方法和属性呢?

虽然 str1、str2不是对象,但可以用String上的方法和属性

再看,如果直接给str1、str2定义方法和属性呢?

可以看出str1、str2是不能定义自己的方法和属性的,而str3可以

这就能看出 js 的神奇部分了,什么原理呢?

来看包装对象和原始资料类型

上面看到的str1、str2即为原始资料类型,str3为包装对象,通过typeof可以看出

但str1、str2不能自己定义属性和方法,却可以用String的属性和方法

总结一下

1、第一种和第二种方法定义出来的是原始资料类型,并储存于栈中,并向包装对象(new ..())借来方法和属性.

2、第三种是 包装对象,栈中储存堆指针,堆中储存内容。

关于堆、栈、指针的问题,咱们继续学习

String 对象用于处理文本(字符串):

        参数是要存储在 String 对象中或转换成原始字符串的值 ;

        通过构造函数的方式也可以把数字类型转成字符串类型; 

         let str = new String(123456)

         console.log(str)

         字面量的方式去创建一个字符串 

        let str = 'he k' 

1、属性   length  字符串的长度 

        整个字符串(无论是内部的空格还是外部的空格)都算成长度 

        console.log(str.length) 

        字符串有length属性 也可以被遍历 

         for(var i=0i<str.lengthi++){

            console.log(str[i])}

2、 charAt() 返回在指定位置的字符(注:字符串中第一个字符的下标是0) 

        如果写的索引位置找不到对应的字符 会返回一个空字符串 

         let a = str.charAt(6)

        console.log(a) 

3、concat()    连接字符串 

         会返回一个新的拼接后的字符串 

          let newstr = str.concat('itty')

           console.log(newstr)

4、 replace()    用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串 ;

       replace会把第一参数(第一个参数是属于原字符串的字符)替换成第二个参数里面内容  

        原来的字符串不会受到影响,会返回一个新的替换后的字符串 

         let str = "hello world"

        let a = str.replace('world','kitty') 

          console.log(a,str) 

         let str = 'abc123qwe456' 

 5、/\d/正则表达式 代表字符串里面的第一个数字替换成nnn 

         /\d+/ 表示匹配字符串里面的所有数字当成一个整体替换成nnn 

         let a = str.replace(/\d+/,'nnn') 

        因为/\d+/ 这段正则不是全局的,所以只会改变第一个匹配项(123整体) 

        因为/\d/ 这段正则不是全局的,所以只会改变第一个匹配项(1) 

         let a = str.replace(/\d/,'n') 

        想让str中所有的数字都变成n 

         正则里面的g表示全局的意思 str.replace(/\d/g,'n') 可以把字符串里面的每一个数字都变成n 

         正则里面的g表示全局的意思 str.replace(/\d+/g,'n')

         把字符串里面的所有数字当成一个整体都变成n    

         let a = str.replace(/\d/g,'n') 

         console.log(a) 

         sort会对原数组造成影响 

         let arr = [4,5,1,3]

         let newarr = arr.sort()

         console.log(arr[0])

         let str = 'abcdefg' 

        eg: 通过索引找到e charAt方法, 再写一个字符串 aaaa 拼接到str上 并答应出来新的字符串 ,  把abcd替换成hello 并把替换后的字符串打印出来;

         let str = 'abcdefg'

         console.log(str.charAt(4))

         let str2 = 'aaaa'

         let newstr = str.concat(str2)

        console.log(newstr)

        let rstr = str.replace('abcd','hello')

         console.log(rstr)

         function fn(){

       arguments 参数集合 是一个类数组  

        类数组不具有数组的方法 比如push 

        arguments.push(5) 

       es6里面提供了一个方法 Array.from

       使用Array.from把类数组转成真正的数组,这样就可以使用数组的方法了 比如push pop 

         let arr = new Array() 

        let arr = Array.from(arguments)

        arr.push(5)

         console.log(arr)}

         fn(1,2,3,4)

6、split()  把一个字符串分割成字符串数组 

        数组转字符串 

        let arr = [1,2,3]

        let str = arr.join('-')

        console.log(str) 

         let str = 'hello' 

         split()不加参数 会把hello这个整体放到数组当中 

         str.split('') 把hello这个字符串 用空字符串分割 转化为数组 

        str.split(',') 如果用字符串中不存在的字符分割 那么还是会把整体放到数组中 

        str.split('e') 用e当作分割符 把字符串分割成数组 ['h','llo'] 

         str.split('l') 用l当作分割符 会变成空字符串 因为有两个l 所以会分割成用['he', '', 'o'] 

        let arr = str.split('l')

        console.log(arr)

7、 indexOf()    返回某个指定的字符串值在字符串中首次出现的位置(★首次很重要) 

         let str = 'hello'

       str.charAt(1) =>e 

         和数组的indexOf一样 

        let index = str.indexOf('l')

         console.log(index)

 8、lastIndexOf()    返回一个指定的字符串值最后出现的位置 

         let str = 'hello'

         let index = str.lastIndexOf('l')

         console.log(index)

 9、 match()  可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配 

         let str = 'he123llo456' 

         str.match('o') 使用match来检索o 可以知道o在字符串内的信息,以数组的形式返回

        比如o所在的索引,o所在的字符串和o的长度 

        let a = str.match('o')

         console.log(a)

         /\d+/ 代表匹配一段整体的数字 

         /\d/代表匹配一个数字 g代表全局

        总体来说就是 在str字符串全局内 去查找一个一个的数字

        会以一个数组的形式方式

        不写g 只会返回第一个  写g 代表全局 会查找所有 

        let a = str.match(/\d+/g)

        console.log(a) 

10、 toLowerCase()    把字符串转换为小写 

         let str = "HELLO"

         let str2 = str.toLowerCase()

         console.log(str2)

 11、 toUpperCase()    把字符串转换为大写 

         let str = 'hello'

        let str2 = str.toUpperCase()

        console.log(str2)