JavaScript语法基础—变量与数据类型
文章目录
标识符
标识符:变量、函数、属性的名称。
组成规则
- 第一个字符必须是字母、下划线或$
- 其他字符为字母、下划线、$或数字
- 不能为关键字
注释
//单行注释
/*
块注释
*/
变量
javascript中有三个关键字可以声明变量 var、const、let
var关键字
1.var声明作用域
var声明的变量只是在当前所在函数的局部变量,在函数退出时被销毁。
例:
function test(){
var message = "test";
}
console.log(message);//报错
当去掉var关键字时message就变成了全局变量只要调用一次函数test()message就可以被外界访问到。
2、var声明提升
function test(){
console.log(test);
var test = "test";
}
上面代码时正确的,当var关键字声明变量时变量会自动提升到作用域顶部。等同于
function test(){
var test = "test";
console.log(test);
}
let关键字
let和var的区别就是var声明范围是函数作用域而let的声明范围是块的作用域作用域仅限于块内部
同时let变量不允许同一个区域出现冗余声明
//声明范围
if(true){
let test = "test";
}
console.log(test)//报错 test未被定义
//冗余声明
let test
let test // 报错 test已经声明过了
//嵌套时
var test = 'test';
if(true){
}
但声明冗余对var和let而受影响这两个关键字并不是不同类型的变量只是指出变量在相关领作用域如何存在。
var test;
let test // 报错
------------------
let test
var test // 报错
let声明的变量不会在作用域中提升
console.log(test);
let test = 'test; // 未定义
全局声明
使用了let在全局作用域中声明的变量不会成为window对象属性(var会)
当let声明作用域是全局作用域时,为避免SyntaxError需要确保页面不会重复声明一个变量。
条件声明
var声明变量时,声明会被提升所以,多余的声明会在顶部合并为一个声明,但let的作用域时块,不可能检查前面是否已经使用let声明过,此时若前面有就不能声明
所以不能使用let进行条件式声明
<script>
var name = 'jay';
let age = '18'
</script>
<script>
//不确定页面中是否声明了同名变量
var name = 'jie';//var会提升作用域并合并 不会报错
let age = '18'; // age之前声明过,则会报错
</script>
for循环中的let声明
在let出现前变量会绳头到循环内部
//使用var
for(var i = 1;i <= 5;i++){
setTimeOut(() => console.log(i),0);
}//实际输出 5,5,5,5,5
使用let
for(let i = 1;i <= 5;i++){
setTimeOut(() => console.log(i),0);
}//实际输出1,2,3,4,5
const关键字
const声明与let基本相同,唯一区别就是声明const时需要给变量赋值,且不能修改const赋值的变量。
//不能重复赋值
const test = 'test';
test = 'test111'//报错
声明风格
const优先let次之,尽量少使用var
数据类型
typeof操作符
用于确定任意变量的数据类型,放回以下数据类型:
- ”undefined“表示值未定义
- ”boolean“表示值为布尔值
- "string"表示值为字符串
- "number"表示值为数值
- "object"表示值为对象或null(空对象)
- "function"表示值为函数
- "symbol"表示值为符号
let message = "some string"
console.log(typeof message);//string
console.log(typeof(message));//string
console.log(typeof 857);//number
undefined类型
undefine类型只有一个undefined值,当使用var或let声明变量但没有初始化时,就相当于给变量赋值了undefined值,undefined于它的字面量相比较时也是相等的。
let test;
con.log(test == undefined);//true;
注意undefined和未定一变量时有区别的,但调用typeof放回的结果是一样的
let name;
//let age;//未定义
console.log(name);//undefined
console.log(age);//报错
console.log(typeof name);//undefined
console.log(type age);//undefined
undefined是一个假值(false)
Null类型
null类型同样也只有null值,表示一个空对象指针,所以typeof传入null返回object类型。
undefined是由null派生而来,所以undefined == null结果为true。
null可以显式调用用于填充变量,但undefined一般不进行显示调用。
let test = null;
let test1 = undefined//一般不这样用
console.log(typeof test);//object
null也是个假值(false)
Boolean类型
有两个字面量true,false(注意区分大小写)
其他类型也可以转换为Boolean类型值
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 非空字符串 | 空字符串 |
Number | 非零数值 | 0,NaN |
Object | 任意对象 | null |
Undefined | N/A | undefined |
Number类型
1、浮点值
定义浮点值数值中必须包含小数点,且小数点后必须有一位数字(否则会自动转换为整型)
let floatNum1 = 1.1;
let floatNum2 = .1//有效但不推荐
let floatNum3 = 1.//当成整数1处理
let floatNum4 = 1.0//当成整数1处理
//科学计数法
let floatNum5 = 1.234e7//12340000
浮点值的精确度最高可达到17位小数,但在计算中远远不如整数精确,例如0.1+0.2 不等于0.3而是0.30000000000000004由于这种微笑的舍入错误,难以判断特定浮点值。
if(a+b == 0.3) // 判断不一定正确
所以永远不要测试某个特定浮点值
值的范围
最小值 Number.MIN_VALUE
最大值 Number.MAX_VALUE
不同浏览器值不一样
若超出范围则用infinity与*-infinity*表示(infinity不能参与运算)
可以使用isFinite()函数来判断是否在最小值和最大值之间
let test = Number.MAX_VALUE + 1;
console.log(isFinite(test));//false;\
NaN
特殊值NaN,意思是”不是数值“(Not a Number) 用于表示返回数字操作失败0、-0、+0相除时也会放回NaN:
console.log(0/0); //NaN
console.log(-0/+0); //NaN
//若分子是非0值,分母为有符号0或无符号0则会返回Infinity或-Infinity:
console.log(5/0);//Infinity
console.log(5/-0);//-Infinity
NaN不等于包括NaN的任何值
javascript提供了一个函数来判断一个数是否是”不是参数“,把一个值传给isNaN后该函数会尝试将参数转换为数字若可以转换则放回false若不行则返回true。
console.log(isNaN(NaN));//true
console.log(isNaN(10));//false 10是数值
console.log(isNaN("10"));//false 可以转换为10
console.log(isNaN("blue"));//true 不可以转换为数值
console.log(isNaN("true"));//false 可以转换为数值1
数值转换
三个函数可以将非数值转换为数值
1、number()函数:
- 布尔值,true为1,false为0。
- 数值,直接返回
- null,放回0
- undefined,返回NaN
- 字符串:
//1.包含数字字符串 Number("1");//返回1 Number("011");//返回11 //2.包含浮点型格式 Number("1.1");//返回1.1 //3.包含有效十六进制格式放回对应十进制 Number("0xf")//返回15 //空字符串返回0 //其他情况返回NaN //若为对象则调用valueOf方法
parseInt
从第一个非空格字符判断若不为±或数字则直接放回NaN
let num1 = parseInt("1234test");//1234
let num1 = parseInt("");//NaN
let num1 = parseInt("0xA");//10
let num1 = parseInt(22.5);//22
let num1 = parseInt("70");//70
let num1 = parseInt("0xf);//15
可传入第二个参数表示转换为几进制。
parseFloat
与parseInt函数类似,始终忽略开头的0
String类型
1、模板字面量
可以跨行定义字符串
//用法
let test = `
<div>
<a href="#">
<span>jake</span>
</a>
</div>`;
模板字面量会保留反引号中的空格,使用时要格外注意
2、字符串插值
通过${}实现
let name = 'jay';
let age = '18';
let test =
`name : ${name};age :${age}`;
3、模板字面量标签函数
标签函数会接受被插值几号分割后模板和对每个表达式求值的结果
例:
let a = 1;
let b = 2;
function Sample(strings,a,b,sum){
console.log(strings);
console.log(a);
console.log(b);
console.log(sum);
return 'foobar';
}
let result = `${a} + ${b} = ${a + b}`;
let tagResult = simple`${ a } + ${ b } = ${a + b}`;
/*
[""," + "," = ",""]
1 2 3
*/
console.log(result);//" 1 + 2 = 15"
console.log(tagResult);//"foobar"
object
object是所有对象的基类所有所有对象都有该类的属性和方法