变量和数据类型

1、什么是变量
变量是计算机内存中存储数据的标识符,根据变量名称可以获取到内存中存贮的数据
ECMAScript的变量是松散类型的,所谓松散类型是可以保存任意类型的数据,换句话说,
每个变量仅仅是一个用于保存值的占位符而已。

定义变量要用到var,var是一个关键字

js是一种弱类型语言
而强类型是指变量一旦类型确认之后,赋值必须是该类型,也就意味着不能将一个变量
随意修改数据类型

js是一种脚本语言

变量是存储在栈中,栈中的数据存储较少,读取较快。

1.1、变量命名方式
为什么使用变量:使用变量可以更方便的修改内存中的数据

变量:设置以后可以修改这个变量的值
常量:设置以后不能修改常量的值,常量名称全部大写,以下划线区分

变量定义完成之后再去定义常量
禁止使用中文定义变量或对象中的key

var num //变量声明
num = “你好” //变量赋值
var s1 = 1,s2 = 2 ,s3 = 3 //多个变量同时/声明赋值

使用一条语句也可以定义多个变量
var message = “hi”,
found = false,
age = 18;
//它们之间用,号隔开即可

var a = 1;
var b = 2;
var c = 3;
可以优化成
var a = 1,
    b = 2,
    c = 3;

1.2、变量命名规则
必须以字母、下划线—,&¥,数字,不能以数字开头
不能是关键字和保留字
关键字是已经被JS定义过的,有特殊作用的
保留字是是预留的关键字,现在可能还不是关键字,以后不一定
区分大小写(也叫大小写敏感)

1.3、变量命名规范(可以不用遵守,但是不建议)
变量名最好有意义(便于能看懂代码)
遵守驼峰命名法(首字母大写,后面小写)
java c#在声明变量的时候就确定了数据类型 int age = 18
js在声明变量的时候并没有确定变量的类型,所以说js是弱类型的语言
在代码执行的过程中,会确定变量的类型
_起头意味着是一个临时变量或者参数

2、数据类型
ECMAScript中有5种简单数据类型:Undefined,Null,Boolean,Number,String
1种复杂数据类型:Object

2.1.1、typeof操作符
它是一个一元运算符,返回值是一个字符串,说明该运算数的类型
因为需要ECMAScript中数据是松散类型的,所以需要用到typeof来检测给定变量的数据类型
console.log(typeof 变量名)
检测类型结果可以是Undefined,Number,String
如果是boolean则返回true或false
如果是object返回object或者null,如果是函数还可以返回function
值得注意的是,typeof null 返回的是object,因为null默认是一个空的对象
所以可以用null来用作判断变量是不是一个对象

2.1.2、instanceof运算符
它是用来测试一个对象在其原型链上是否存在一个构造函数prototype属性
var a = new Array();
alert(a instanceof Array);
alert(a instanceof Object);
两个结果都会返回true,这是因为Array是Object的子类

2.2、Number
十进制 var num =10;
十六 进制 0-9,a-f 0x开头的数字就是十进制
八进制0-7 var num = 010 0开头的是八进制

2.2、浮点数
浮点数的精度问题
var n = 5e-324;
浮点数存在精度丢失问题,所以不能判断两个浮点数相加是否两两相等问题
会做特殊处理,之后会讲到

2.3、数值范围
Number.Max_Value 5e-324
Number.min_Value 1.79769313e+308
Infinity无穷大,-Infinity无穷小
isFinite()可以判断一个数是不是处于最小最大值之间,是的话返回true

2.4、数值判断
NaN Not a Namber
与任何值都不相等,包括它本身,所以它不能做运算和判断,都会返回NAN
针对这个特性定义了isNAN()函数,任何不是数字的都是返回true,”10“因为可以转化为数字
所以返回值是false,true可以是1,所以也是true

2.5、String类型
字符串字面量
\后面加“或者‘是转义的意思,表示引号不再有特殊意义,正常作为字符输出
\n在字符串里卖弄使用是换行
\t是代表四个空格,相当于一个shift
\是用\对\做了一个转义,让\可以直接输出
\r是回车

String类型的拼接
如果+两边是number类型的变量,执行的是数学运算的加
如果+两边是string类型,拼接字符串
如果是number和string,执行的也是拼接(会先将数值类型自动转换为字符串类型)
如果是字符串和true,执行的也是拼 接,也是先将布尔类型转换成字符串类型

2.6、布尔类型
true(1)和false(0)

2.7、Undefined和Null
这俩都是数据类型,但是只有一个值
1、undefined表示一个声明了没有赋值的变量,变量声明的时候默认是undefined
2、null表示一个空,变量的值如果想为空,必须手动控制

2.8、复杂数据类型
Object 和 null

3、字面量和数据类型的转换

3.1、字面量
在源代码中一 固定值的表示法
数值字面量:8.9.10
字符串字面量:”程序员“,”大前端“
布尔字面量:true ,false

3.2、数据类型转换
每种数据类型对应的颜色在控制台是不一样的

3.2.1、转换成字符串类型
1、num.toString(进制)将num数字转换成字符串类型(布尔类型同理)进制数最高到36
进制(数字加字母总和),超过会报错
2、null和undefined没有toString方法
3、String()类型主要可以用来转换null和undefind方法
4、字符串拼接 console.log(num + " ");加空字符

var a = 10;
var b = null;
console.log(Object.prototype.toString.call(a))//object number
console.log(Object.prototype.toString.call(b))//object null

3.2.2、转换成数值类型
1、Number()
Number(abc) 会返回NaN
Number(true) 返回1
把字符串转换为数值类型的时候,有一个字符不是数字就会转换为NaN
会忽略070前面的0

2、parseInt() 取整
无法将布尔类型转换为数值,返回NaN
parseInt(123abc) 会返回123
在转换字符串的时候,如果遇到数字会转换成数字,遇到字母会返回
如果字符串中第一个字符是非数字,此时也是返回NaN
会将070解析成8进制数,es5之后正常转换成十进制
可以parseInt(”0xAF“,16),转换后结果是175
这是规范写法,也可以不带0x,前面是要转换的数值,后面是进制
如果不加进制则是转换为NaN

3、parseFloat()取浮点数
也无法转换布尔类型
和parseInt非常相似,它会解析遇到的第一个小数点,遇到第二个点或者非数字
结束,区别是它始终会忽略第一位的0
如果解析的内容里面只有整数,也是解析成整数

4、取正数或者取负
在字符串前或者后加+/-
-如果有一边是数值类型,一边是字符串,会先把字符串转换成数值类型再进行运算
+如果有一边是数值类型 一边是字符串,会先把数值类型转换成字符串类型拼接

3.2.3、转换成布尔类型
转换成false的情况:undefined,null,”“空字符串,0,NaN,false

3.3、运算符(操作符)operator
表达式 – 操作数和操作符

1、算术运算符:+,-,*,/,%
任何数值类型与字符相加是2,会自动将数值类型转换为字符类型
隐式转换,所有的隐式转换均使用Number(),String(),Boolean()

在加法运算当中,如果有字符参加,就会隐式转换字符,再相连
否则如果没有字符参与,将会隐式转换为数字,进行数值相加
例如null和false都会转换成0
undefined + NaN是NaN

如果有减法,乘法,除法,取模运算时,都会隐式转换为数值再运算

2、一元运算符
只有一个操作数的运算符
i++先返回i的值,再加一
i–,--i与++同理
++i先自身加一,再返回表达式的结构

a+="" 将变量a转为字符型,但是效率不高,因为做的是隐式转换
一旦使用一元运算符,所有内容将会隐式转换为数值运算

a++打印时获取的是a++的值,就是先打印a,再运算
++a是先进行运算再打印a的值

3、逻辑运算符
&& 只有true&&true === true 在xx区间以内
var a = 10
if(a>10 && a<20){

}等价于下面
if(a && a < 20){

}用作先导条件判断,前导条件必须是true或者false
var obj;
if(obj && obj.a>0){

}如果只写obj.a会报错,因为obj不一定存在
而如果&&运算左侧是false,就直接跳出返回false,不执行右侧内容
并不是说与运算符返回值是true和false,是在条件判断语句中,返回值值只有true和false
例如 var a=10 && 20,会返回20,这里会先判断第一个为true则将第二个赋值给a
var a = 0 && 20,这里返回值就直接死false

|| 或者 两个条件满足其一就是true,在xx区间以外
false || false = false,其他均为true

var a;
if(!a) a=0; 等价于 a = a || 0; 都是用来作为判断条件的

4、关系运算符(比较运算符)

ifNaN()根据打印的true或者false来 判断括号里面的是不是非数值

< > <= >= 比较大小
== != 比较是否相等,只是判断值是否相等
!== === 也是比较相等,但是需要类型也相等
===是精确比较,等号两端的值和类型必须完全相等

等于大于等内容,比较时,如果两端均为数值,就以数值比较
如果两端都是字符,则将字符转为unicode编码,然后比较
如果有一端是数值,则都转换为数值,字符只选出字符的第一位出来进行运算

var a = “1”;
if(a == true){
//a为true的时候有三个可能:1,“1”,true
//if a==false时:false,"",0
}
if(a === true){
//a=true
}
if(a){
//除了"",0,undefined,null,false,NaN之外都为真
//同理,if!a刚好就是这6种情况
}

这三种判断条件在没有等号时将true转换为布尔类型,==时将a转换为数值再进行运算
===时不进行转化

var a = 10;
if(atrue){
//a=10或者a=“10”;
}
if(a
=10){
//a=10;
}

0 == “”
0 == false
0 != undefined || 0 != null
undefined == null
没有任何内容与NaN相同,包括NaN自己

5、赋值运算符
+= -= *= /= %=

6、位运算符
& 与运算符
转换成二进制上下对位,数值相同就保存,比如6和5结果是4
2的4次方与2的5次方之间比较都是16,其余都是0
总结起来也就是n&2(m),n<2(m+1),如果n介于2(m)~2(m+1),结果是2(m),除此之外都是0
所以其实与运算多用于与2的n次幂之间的运算
通常用来判断这个值是不是在xx范围之内
例如a在8-15之间就会打印aaa,其他不打印
以上m是平方

var a = 9;
if(a&8){
console.log(“aaa”)
}

| 或运算符
n|2(m)
如果n是2(m)~2(m+1),结
果是n,否则结果是n+2(m),这里的m是平方

^ 异或运算
0^0=0
1^1=0
1^0=1
0^1=1
即相同为0,不同为1
常用来做加密解密

var a = 1356//密码
var b = 1321//key
var c = a^b;
console.log(c^b);
这是一个加密解密操作

~ 位非运算
加一取负

if(~str.indexOf(“b”)){
console.log(“aaaa”);
}
用这个符号可以用来做判断,用来判断str这个字符串里面是否有b

<<n 二进制向左移动n位,后面补0

0 二进制向右移动n位,将移出的部分删除
左右移位主要应用于颜色的转换
1<<n 相当于是用来求2的n次幂,这个方法计算很快
但是缺陷是幂次太高幂会变成负数,不能超过30,因为二进制的长度是有限的

7、条件运算符—三目运算符
var a = 10;
var b = a > 10 ? 20 : 30;
在三目运算中,返回值最好不要是true或者是false

var a=5
var b=a>5//如果a>5,b是true,否则是false

var b = a>3 ? a<6 ? 2 : 3 : 10;//连续三目运算符
转换之后如下
var b = a>3 ? (a<6 ?2 : 3) : 10;//双三目运算符,又叫内嵌式

var b = a>3 ?( a<6 ? 2 : 3 ) : a || 10;
//这个语句做了四个判断

3.4、运算符的优先级
优先级从高到低
1、()优先级最高
2、一元运算符 ++ – !
3、算数运算符 先*/%后±
4、关系运算符> >= < <=
5、相等运算符== != === !==
6、逻辑运算符先&&后||
7、赋值运算符

3.5、进制转换法
10-2 除2取余法,最后用余数反着连起来
2-10 从末尾乘以2的阶乘,从0开始

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值