JavaScript---类型、值和变量

1.数字

JavaScript中采用IEEE 754标准定义的64位浮点格式表示数字。

1.1 整型直接量

/*十进制整型直接量*/
0
123
1000000
/*十六进制整型直接量*/
0x123ab
0xFFFFF
/***************************************************************************************
 *虽然JavaScript某些实现可以允许采用八进制形式表示数字,但ECMAscript标准是不支持八进制直接量的,
 *在ECMAscript 6的严格模式下,八进制直接量是明令禁止的。
 **************************************************************************************/

1.2 浮点型直接量

/*浮点型直接量*/
3.14
2345.789
.123546
6.02e23    //6.02 * 10^23
1.23456789E-32  //1.23456789 * 10^(-32)

1.3 算术运算符

JavaScript提供语言本身的算术运算符来进行数字运算,如加(+)、减(-)、乘(*)、除(/)、求余(%),以及Math对象提供的复杂的运算。如:

Math.pow(2,3) //2^3
Math.PI       //圆周率

在运算过程中可能会出现溢出(超出上限)的情况,用无穷大表示(Infinity);或下溢出(超出下限),用负无穷大表示

(-Infinity)

还有,零除以零是没有意义的,用NaN表示非数字值(Not a Number)。NaN有一个特殊之处,它和任何值都相等,包括它自身。

Infinity和NaN是只读的。

1.4 二进制浮点数和四舍五入错误

先看例子:

var x = .3 - .2;
var y = .2 - .1;
console.log(x == y);
console.log(x == .1);
console.log(y == .1);
console.log(x);
console.log(y);

再看在谷歌浏览器上的运行结果:

由于JavaScript采用的是IEEE 754浮点表示法,这是一种二进制表示法,可以精确表示1/2、1/8、1/1024等。但常用的分数,都是十进制分数1/10、1/100、1/1000等。二进制浮点数表示法并不能精确表示如0.1的数。

由于四舍五入的误差,0.3和0.2之间的近似差值实际并不等于0.2和0.1之间的近似差值。显然,在大多数的计算任务中,这种二进制浮点表示法是使用的,只是在比较两个值相等时才出现上述例子中的问题。

2. 文本

2.1 字符串直接量

使用字符串直接量时需要注意的:

console.log("name = 'Tom'");//双引号中包含单引号
console.log('name = "Tom"');//单引号中包含双引号
console.log('one\
long\
line');//字符串直接量可以拆分成多行,每行以反斜杠(\)结束
console.log('one\nlong\nline');//转义字符(\n)表示另起一行
console.log('O\'Reilly\'s');//字符串中需要用到单引号的,用反斜杠来转义

在谷歌浏览器中输出的结果:

2.2 转义字符

console.log('\0');//反斜杠零,表示空字符(NUL)
console.log('12\b3');//"\b"退格符,用于以前的打印设备,在谷歌浏览器中输出乱码
console.log('12\t3');//“\t”水平制表符
console.log('12\n3');//“\n”换行符
console.log('12\v3');//"\v"垂直制表符,在谷歌浏览器中乱码
console.log('12\f3');//"\f"换页符,在谷歌浏览器中没效果
console.log('12\r3');//"\r"回车符,在谷歌浏览器中没效果
console.log('12\"3');//'\"'双引号
console.log('12\‘3');//”\’“单引号
console.log('12\\3');//'\\'反斜杠
console.log('\x21');//‘\xXX’由两位十六进制数XX指定的Latin-1字符
console.log('\u4ebf');//'\uXXXX'由4位十六进制数XXXX指定的Unicode字符

在谷歌浏览器中的输出:

2.3 字符串的使用

var a = "hello" + " " + "world" + "!!";//使用加号(+)连接字符串
console.log(a);
console.log(a.length);//使用length属性,获取字符串的长度
console.log(a.charAt(10));//第10+1个字符,“d”
console.log(a.substring(0,4));//子字符串的起始位置为0,到子字符串位置为4-1的字符处结束,“hell”
console.log(a.slice(0,4));//效果同上
console.log(a.slice(-4));//如果为负数,表示从末尾开始数起最后4个字符
console.log(a.indexOf('o'));//字符‘o’首次出现的位置
console.log(a.lastIndexOf('o'));//字符‘o’最后一次出现的位置
console.log(a.indexOf('l',4));//在位置4及之后首次出现字符‘l’的位置
console.log(a.split(' '));//分割成子字符串
console.log(a.replace('l','L'));//用一些字符替换另一些字符
console.log(a.toUpperCase());//字符串全部变成大写字母
console.log(a);//上面变量a使用的方法返回一个新的字符串,原字符串a不变
console.log(a[4]);//字符串可以当做数组来操作

在谷歌浏览器中的输出:

2.4 模式匹配 

var a = "Hello world 123,456";
console.log(a);
var b = /\d+/g;//匹配所有包含一个或多个数字的示例
console.log(b.test(a));//返回true,匹配成功
console.log(a.search(b));//首次匹配成功的位置
console.log(a.match(b));//所有匹配组成的数组
console.log(a.replace(b,'abc'));//替换
console.log(a.split(/\D+/));//用非数字字符截取字符串

在谷歌浏览器中的输出结果:

3 布尔值

这个类型只有两个 值,保留字true和false。

 4 null和undefined

/*null常用来描述“空值”*/
console.log(typeof(null));//返回“object”,说明null是一个特殊的对象值
var a;
console.log(a);//未初始化的变量为undefined
console.log(typeof(a));//返回undefined类型
console.log(null == undefined);//true
console.log(null === undefined);//false
a = null;
console.log(a);
var b = 6;
console.log(b);
b = undefined;
console.log(b);

在谷歌浏览器中的输出是:

 5 显式类型转换

console.log(Number("123"));//转换为数字123
console.log(String(false));
console.log(false.toString());//转换为字符串
console.log(Boolean([]));//true,转换为布尔值
console.log(Object(3));//类似于new Number(3)

console.log(typeof(123));
console.log(typeof(123 + ''));//等价于String(123)
console.log(typeof('123'));
console.log(typeof(+'123'));//等价于Number('123')
console.log(!!123);//true
console.log(!!-12);//true
console.log(!!0);//false,等价于Boolean(0)

/*Number类定义的toString()方法可以接收表示转换基数的可选参数*/
var n = 17;
console.log(n.toString(2));
console.log('0' + n.toString(8));
console.log('0x' + n.toString(16));

/*toFixed()根据小数点后的指定位数将数字转换为字符串
 *toExponential()使用指数记数法将数字转换为指数形式的字符串
 *toPrecision()根据指定的有效数字位数将数字转换成字符串
 */
 var m = 123456.789;
 console.log(m.toFixed(5));
 console.log(m.toExponential(3));
 console.log(m.toPrecision(7));
 
 /*parseInt()只解析整数
  *parseFloat()可以解析整数和浮点数
  *他们都是全局函数
  */
  console.log(parseInt("3 adc"));//3
  console.log(parseInt("3.14 abc"));//3
  console.log(parseInt("abc 3"));//NaN
  console.log(parseInt("0xff"));//255
  console.log(parseInt(".1"));//NaN
  console.log(parseFloat(".1"));//0.1
  console.log(parseFloat("$74.13"));//NaN
  console.log(parseFloat("3.14 abc"));
  /*parseInt()可以接收第二个参数,这个参数指定数字转换的基数*/
  console.log(parseInt("ff",16));//十六进制的ff

在谷歌浏览器中的输出:

6 声明变量

变量的声明,使用关键字var。 

var a = 1;//声明一个变量a
console.log(a);
var a = 2;
console.log(a);//重复声明,相当于a = 2;
var a;
console.log(a);

在谷歌浏览器中的输出结果:

7 变量作用域

var a = 1;//全局变量,具有全局作用域
var fun1 = function(){
	var b = 2; 
	console.log(a);//a为全局变量,可以在JavaScript代码中任何地方使用
}
fun1();
/*var fun2 = function(){
	console.log(b);//b为fun1函数的局部变量,作用域在fun1函数内
}
fun2();//调用函数时会出错*/
var fun3 = function(){
	var a = 3;//局部变量的优先级高于同名的全局变量
	console.log(a);
}
fun3();
c = 4;//全局变量c,尽管在声明全局变量时可以不用var
var fun4 = function(){
	var c = 5;//局部变量c,但声明局部变量时必须使用var
	//c = 5;//局部变量c,不使用var,会修改全局变量c的值
	d = 6;//不使用var,声明的是全局变量,观察fun5函数的输出
	console.log(c);
	console.log(d);
}
fun4();
console.log(c);//观察在局部变量c使用var时和不使用var时的值
var fun5 = function(){
	console.log(d);
}
fun5();//d是全局变量,输出6

/*局部作用域嵌套的情况*/
function fun6(){
	var a = 11;//fun6函数的局部变量a
	
	function fun7(){
		var a = 12;//fun7函数的局部变量a
		//a = 12;//将修改fun6函数局部变量a的值
		console.log('fun7 = ' + a);
	}
	fun7();
	console.log('fun6 = ' + a);
}
fun6();
console.log(a);//全局变量a

/*函数作用域*/
function fun8(o){
	var i = 0;//i在函数体内均有定义的
	if(typeof o == "object"){
		var j = 0;//j在函数体内也是有定义的
		for(var k = 0; k < 10; k++){//k在函数体内也是有定义的
			console.log(k);//输出0~9
		}
		console.log(k);//输出10
	}
	console.log(j);
}
fun8({x:1});

/*声明提前*/
function fun9(){
	//var a;
	console.log(a);//undefined
	var a = 21;
	//a = 21;
	console.log(a);//21
}
fun9();
console.log(a);//全局变量a

 在谷歌浏览器的输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值