变量
- 变量名必须以 英文字母、_、$ 开头
- 变量名可以包括英文字母、_、$、数字
- 不可以用系统的关键字、保留字作为变量名
- 区分大小写
- 类型不需要定义,由值决定类型
数据类型概要:
javascript是动态语言
解释一行,编译一行,所以变量由值确定类型
并且,解释性语言(弱数据语言)永远不可能输出地址
值类型有:原始值,引用值(他们的赋值有区别)
原始值:
- Number(=右边为数字,数字是浮点型)
- String(=右边的内容用单引号或双引号包含起来)
- Boolean(=右边的值有true或false)
- undefined(=右边的值只有undefined,意为未定义)
- null(=右边值为null,意为空,一般用作覆盖某些变量的值)
引用值:
- function(函数)
- array(数组)
- object(对像)
原始值和引用值的区别:
例一:
var a = 10;
var b = a;
a = 20;
(a的值改为20,但b的值仍旧是10)
原始值存在stack(栈)里面
栈的一个规则:先进后出
栈内存和栈内存之间的赋值是copy,互不影响
例二:
var arr = [1];
var arr1 = arr;
arr.push(2);
(arr和arr1都改为1,2)
引用值存在heap(堆)里面
堆heap内存是引用值(值放入堆heap内存中,值对应的地址放进栈stack中)
例三:
var arr = [1,2];
var arr1 = arr;
arr = [1,3];
(arr的值改变,但是arr1的值不变,因为 arr = [1,3]; 是arr重新在堆heap里申请了新的空间,且值对应的存在栈stack里的地址得到改变,而arr1的堆heap的值和栈stack的地址都没变)
typeof
typeof()用来返回括号中的值的类型
六种数据类型:
- number(infinity,NaN属于number类型)
- string
- boolean
- undefined
- object(注意:null,数组,对象的数据类型是object)
- function
typeof调用方法:
- typeof(变量)
- typeof 变量
一般,如果访问没定义的变量,会报错
但有一极特殊的情况,
当且仅当:未定义的变量放入typeof()中不会报错
result: undefined(是字符串类型的)
类型转转
考虑原始值的类型转换即可,引用值的类型转换没意义
###显示类型转换
Number() :
例一:
var num = Number('123');
//等价于 var num = 123;
例二:
一般明显是非数的转换为Number,为NaN
var demo = undefined;
var num = Number(demo);
console.log(typeof(num) + ":" + num);
result: Number : NaN
例三:
var demo = "123abc";
var num = Number(demo);
console.log(typeof(num) + ":" + num);
result: Number : NaN
例四:
var demo = "-123";
var num = Number(demo);
console.log(typeof(num) + ":" + num);
result: Number : -123
例五:
Number(true)的结果是 1
Number(null)的结果是 0
parseInt() :
一:括号内的数据类型转换为整型,将字符串和数字转换为整型,而其余的为NaN
二:parseInt(),括号内可以写两个参数,右边的是基底radix
三:parseInt(),括号内的数据,从第一位数字位看起,看到非数字位停止(若第一位不是数字,则返回NaN)
例一:
var demo = "123";
var num = parseInt(demo);
console.log(typeof(num) + ":" + num);
result: Number : 123
例二:
var demo = true;
var num = parseInt(demo);
console.log(typeof(num) + ":" + num);
result: Number : NaN
例三:
var demo = "123.9";
var num = parseInt(demo);
console.log(typeof(num) + ":" + num);
result: Number : 123
二:parseInt(),括号内可以写两个参数,右边的是基底radix
例一:
var demo = "10";
var num = parseInt(demo,16);
console.log(typeof(num) + ":" + num);
result: Number : 16
基底是16,所以左边参数认为为16进制的,然后转换为十进制
例二:
注意:radix的范围一般2-36,代表的是进制,对应的不合理的数结果为NaN
var demo = "3";
var num = parseInt(demo,2);
console.log(typeof(num) + ":" + num);
result: Number : NaN(例二中radix为2,二进制数不存在3)
parseFloat() :
与parseInt()有许多相似之处
区别:parseFloat是转换为浮点型,而且只能有一个参数
String() :
无论是什么,都转换为字符串
toString() :
- 写法有一些不同
var demo = 123; var num = demo.toString();
- 也可以转换为字符串(注意,undefined和null不能toString,不然会报错)
- toString()括号中也可以有参数,toString(radix),不过这个radix是目标进制(和parseInt()中的第二个参数是基底不同),若radix为8,即将十进制的数转换为八进制的数
Boolean() :
转换为布尔值
只有六种值对应的boolean值是false;
- undefined
- null
- NaN
- “” (空字符串**"",和空格字符串" "**不一样)
- false
- 0
隐式类型转换
一元正负,加减乘除取余;大于小于等于…(有数字);
都先隐式的调用Number()
与或非,先隐式的调用Boolean()
isNaN() :
自己写一个isNaN()的功能:
function isNaN(num) {
var ret = Number(num);
ret += "";
if (ret == "NaN") {
return true;
}
else return false;
}
isNaN()会先隐式的调用Number(),再判断是不是NaN,是则为true,否则为false
几个特殊知识点(undefined,null,NaN):
- undefined和null 与数字0比较的结果都是false(无论是大于小于,还是等于)
- undefined == null;的结果是true
- NaN == NaN; 的结果是false(NaN不等于任何数,包括它自己)
避免发生隐式类型转换 :
绝对等于 ===
绝对不等与 !==