字符串 string
数据类型
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。
引用数据类型:对象(Object)、数组(Array)、函数(Function)。
注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。
<script>
//字符串特性 由0个或多个16位unicode字符组成;
//引号包裹,单引号和双引号都可以;但是单引号和双引号不能交叉使用;
//(放在引号内的任何东西都是属于字符串,即使里面没有东西或者是空格,都属于合法的字符串 )
let str1="1";
let str5='';
let str2="";
let str3=" ";
let str4="function(){}";
console.log(typeof str1);
console.log(typeof str2);
console.log(typeof str3);
console.log(typeof str4);
console.log(typeof str5);
console.log(".............");
//JavaScript 拥有动态类型。这意味着相同的变量可用作不同的类型
/* var a;//undefined
var x=5;//number
var x="John";//string */
//typeof 判断数据类型
let a=1;
let b;
let c="daiqi";
function run(){};
let d=[1,2,3,4,5];
let e={name:"daiqi"};
console.log(typeof a);//number
console.log(typeof b);//undefined
console.log(typeof c);//string
console.log(typeof run);//function
console.log(typeof d);//object
console.log(typeof e);//object
console.log(".............");
//instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
//也可以理解为是否为某个对象的实例,typeof不能区分数组,但instanceof则可以。
let f=[];
let g={};
console.log(f instanceof Array);//true
console.log(g instanceof Array);//false
let h=[1,2,3];
let j={name:"daiqi"};
console.log(h instanceof Array);//true
console.log(j instanceof Object);//true
function User(){};
let k=new User();
console.log(k instanceof User);//true
</script>
强制类型转换 就是一种数据类型转换成另外一种数据类型
字符串转成数值型,将数值型转换成布尔值
例如:js写一个加法计算器 ,输入语句prompt( ) 所获得的数据默认为字符串
而字符串的数据 无法直接用加法 即使写上加法命令 ,结果也是字符串与字符串的拼接
所获得的数据 必须进行强制转换为数值型 才能进行运算
//转换成 "字符串" 共有3 种方法 //方法一:利用toString()方法转换成字符串类型 //适用类型 Number/Boolean/String/Object 参数:number类型的数值基数;一般不需要写 //在null空值 和 undefined未定义型是不能用的 let a=123; a=a.toString(); //写个a 后面跟着点 意思是把变量a的值进行某种操作 //点的后面是要写执行操作的内容 ,因为后面要把a强制转换为字符串 console.log(typeof a,a);//string 123 console.log('....................'); //方式二: String()函数进行强制转换 (可将空值和未定义型进行强制转换) //先写String() ,然后在括号中写上需要转换的变量,最后给变量赋值 let b=567; b=String(b); console.log(typeof b,b); //方法三: 隐式转换 用"加号+" ,只要有字符串参与的就表示字符串拼接 var e=99+""; console.log(typeof e,e);//string 123 var c=null+""; var d=undefined+""; console.log(typeof c,c);//string null console.log(typeof d,d);//string undefined //某个数据并不仅限于Number类型;数组也可以的; console.log(typeof ([1,2,3,4]+""));//string
js普通字符串和new String有什么区别
转义序列
字符串就是对象,只不过存储的内存不一样
基本数据类型是存储在栈 (stack)内存中的,而引用类型 对象(object) 是存储在堆中的,但为什么栈内存也可以有方法和属性
str1 又不属于String 却拥有String的方法
因为这是Js中设计的
原始资料类型的方法与属性是"借" 来的,所有原始资料类型可以向new String() 或new Number()借来所有的方法,但是自己本身却没有属性和方法
系统内部,字面量字符串 [借用] new String()属性
//字符串为什么可以用下标访问 结论:字符串就是对象
var str1="123";//string 不是对象===>栈
var str2=new String("123");//object 对象===>堆内存
str1.charAt();
str2.charAt();
//值类型 与 对象
//用字面量 与 对象方法创建字符串 返回不同的类型
//只有对象才能使用的方法,值类型也可使用方法, 因为执行时会将值类型转为对象
let name="Matt";
let age=new String("4");
console.log(typeof name,typeof age);//string , object
console.log(name.length);//4
console.log(age.length);//1
字符串一旦被创建,其值是不能改变的,若要改变必须销毁原有字符串,然后用另一个包含新值的字符串填充改变量
//字符串创建的原理;
var str1="12345";//把"12345"这个字符串赋值给str1这个变量;
str1="1234";//把"1234"这个字符串赋值给str1这个变量;
//并不是把"12345"修改为"1234"然后赋值给str1
console.log(str1);//1234
console.log('123\'456\'78');//123'456'78
\n 换行,常用alert
转义符 \" 双引号 \' 单引号
//document.write('这是\"送给您\" 的一朵花');
//document.write("这是\'送给您\'的一朵花");
//document.write("这是送给您的<br/>一朵花"); //document.write()中换行 用<br/>
alert("这是送给您的\n一朵花");//在alert()中换行,用\n
JavaScript多行字符串
模板字符串
//ES2015之前 //强行将一个字符串分为两行,然而事实是代码会报错。 /* var str="我叫苗苗,我的生日是 2016.06.20";//报错 */
//在行尾添加反斜杠,可实现代码上的换行操作,不会报错, //但这种换行方式并非标准规定,所以不推荐使用 //虽然在代码上确实实现了换行,但是实际运行打印结果确实字符串依然在一行显示。 var str="我叫苗苗,我的生日是\ 2016.06.20"; console.log(str);//我叫苗苗,我的生日是2016.06.20 //在字符串需要换行的地方添加换行符 var str="我叫苗苗,我的生日是\n2016.06.20"; console.log(str); //ES2015之前后 //模板字面量 使用反引号创建 ,可轻松实现换行 直接在代码中进行换行即可,表现与普通字符串一样,当然它的功能不止于此 //注:在模板字符串中,空格总是会计算在内的,所以要注意换行的缩进。 var str=`我叫苗苗,我的生日是 2016.06.20`; console.log(str); console.log(str.length);//21
模板字符串
//${表达式}占位符需要和模板字符串配合使用。也就是为某一个数据结构占据位置,
//${}占位符:
//可以直接在模板字面量中插入占位符${}。
//占位符就如同一个普通字符串一样,可以插入到字符串中的任意位置。
//大括号中可以是任何合法的表达式,并返回此表达式的值,通过占位符可以实现灵活的拼接操作
//占位符中的表达式是对函数的调用,函数返回一个字符串。
let func=(url)=>{
return url;
}
let str=`本站的url地址是${func("baidu.com")}`;
console.log(str);//本站的url地址是baidu.com
//占位符中是数组,但是这个数组所处的上下文环境是字符串。那么就隐身调用toString方法将其转换为字符串。
let arr=["这","是","我","的"];
let str=`${arr}`;
console.log(str);
//ES5字符串:可以通过双引号或者单引号创建字符串,不能实现字符串换行或者格式化等操作
//如果在字符串中插入一个JavaScript表达式 需要使用+进行字符串连接。
const person={name:"琪琪",age:24,hobby:"游泳",hometown:"河北"};
const intro="大家好,我是"+person.name+",今年"+person.age+",我的爱好是"+person.hobby+",我的家乡在"+person.hometown;
console.log(intro);//大家好,我是琪琪,今年24,我的爱好是游泳,我的家乡在河北
//如果用模板字面量,通过反引号定义,代码很自然的利用占位符将变量插入到字符串中
//这里的字符串不是普通字符串,而是模板字符串(他是原有普通字符串的加强)
const intro2=`大家好,我是${person.name},
今年${person.age},
我的爱好是${person.hobby},
我的家乡在${person.hometown}我是${person.age>18?"成年":"未成年"}`;
console.log(intro2);//大家好,我是琪琪,今年24,我的爱好是游泳,我的家乡在河北
//模板字符串不光可插入变量 也可插入表达式
//1.把下面的代码改为模板字符串
const weather={
city:"广州",
temperature:27,
humidity:"94%"
}
const weatherForecast=`下面播报一则天气预报:${weather.city}气温${weather.temperature}, 湿度${weather.humidity}`;
console.log(weatherForecast);
//2.使用模板字符串输出以下语句:你输入的参数{x} 他的2倍{2x} 他的平方{x^2}
function calc(x){
return`你输入的参数是${x},他的2倍是${2*x},他的平方是${x*x}`;
}
console.log(`${calc(3)}`);
//占位符是JS表达式,那么可替换的就不仅仅是简单的变量名 let name="LiLi"; let message =`hello,${name}`; console.log(message); //占位符是JS表达式,可以轻易嵌入运算符 let count =10; price=0.25; message=`${count} is cost$${(count*price).toFixed(2)}`; console.log(message); //占位符是JS表达式,函数调用 function fn(){ return "hello world"; } console.log(`${fn()}`); //模板字面量本身也是 JS 表达式,因此可以将模板字面量嵌入到另一个模板字面量内部 let name="LiLi"; message=`Hello,${`my name is ${name}`}`; console.log(message);
/* //分割字母
let name ="daiqi";
console.log(name.split(""));//["d", "a", "i", "q", "i"]
//字符串转为数组
console.log("1,2,3".split(","));//["1", "2", "3"] */
<script>
//占位符是JS表达式,那么可替换的就不仅仅是简单的变量名
let name="LiLi";
let message =`hello,${name}`;
console.log(message);
//占位符是JS表达式,可以轻易嵌入运算符
let count =10;
price=0.25;
message=`${count} is cost$${(count*price).toFixed(2)}`;
console.log(message);
//占位符是JS表达式,函数调用
function fn(){
return "hello world";
}
console.log(`${fn()}`);
//模板字面量本身也是 JS 表达式,因此可以将模板字面量嵌入到另一个模板字面量内部
let name="LiLi";
message=`Hello,${`my name is ${name}`}`;
console.log(message);
</script>
使用 slice、substr、substring
函数都可以截取字符串。
<script>
//length属性 获取字符串长度
//字符串大小下转换 toUpperCase();转字符串大写 toLowerCase();转字符串小写
console.log('daiqi'.length);//5
console.log("daiqi".toUpperCase());//DAIQI
console.log("DDDD".toLowerCase());//dddd
//使用trim删除字符串左右的空白字符
let str = 'houdunren.com ';
console.log(str.length);
console.log(str.trim().length);
//使用trimLeft删除左边空白,使用trimRight删除右边空白
let name=' daiqi ';
console.log(name);
console.log(name.trimLeft());
console.log(name.trimRight());
//获取单字符
//根据从0开始的位置获取字符
console.log('daiqi'.charAt(3));//q
//使用数字索引获取字符串
console.log('daiqi'[2]);//i
</script>
//使用 slice、substr、substring
函数都可以截取字符串。
<script>
let name='daiqisqy.com';
console.log(name.slice(3));//qisqy.com
//substr和substring有什么区别
//substr 着重在于截取多长的字符串
//他们传入的第一个参数都是起始位置
let str="I am a front-end developer";
console.log(str.substr(7,9));//从7开始,9代表多长 就把front-end截取出来
//如果第一个参数传入的参数是一个负值,可从字符串的结尾往前寻找的,第2个参数还是写长度
//如果后面的长度不写 或 写的是超过实际字符串的数字(如字符串总长是9,却写了个18)实际只会截取到字符串的结尾
console.log(str.substr(-9,9));//developer
console.log(str.substr(-9,19));//developer
console.log(str.substr(-9));//developer
//substring着重在于截取字符串那个位置 到 那个位置 (第1个参数不能使用负值)
//第二个参数一定要比你要截取到的下标 多一个, 与slice相似
console.log(str.substring(7,16));
console.log(str.substring(7,0));//I am a
console.log(str.substring(3, -9)); //I a 负数转为0
console.log(str.slice(7,16));
</script>