1.JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
数据类型主要有以下几种:
数值 布尔型 字符串 null undefined 对象原始类型有以下几种:
数值 字符串 布尔型复杂类型为:
对象特殊型:
undefined原始类型和复杂类型的区别:
1.基本类型变量存的是值,复杂类型的变量存的是内存地址。
2.基本类型在赋值的时候拷贝值,复杂类型在赋值的时候只拷贝地址,不拷贝值。
2. typeof和instanceof的作用和区别?
在JS中会有三种方式可以确定一个值的类型。分别是:typeof、instanceof、object.prototype.tostring。
- 判断数据类型,是一种特殊的运算符,后者判断实例的类型,前者判断简单的数据类型。
- instanceof作用判断一个东西是否是某个构造函数的实例。
- typeof可能返回以下值:
1.undefined--如果这个值未定义
2.boolean--如果这个值是布尔值
3.string--如果这个值是字符串
4.number-- 如果这个值是数值
5.object--如果这个值是对象或者null
6function--如果这个值是函数
3. 如何判断一个变量是否是数字、字符串、布尔、函数
我们可以使用typeof进行判定
- 数字:
var a=1
typeof a //"number"
- 字符串
var b='abc'
typeof b //"string"
3.布尔
var c=false
typeof c //"boolean"
4.函数型
var d=function(){}
typeof d //"function"
4. NaN是什么? 有什么特别之处?
NaN ,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。例如,在其他编程语言中,任何数值除以 0 都会导致错误,从而停止代码执行。但在 ECMAScript 中,任何数值除以 0会返回 NaN ,因此不会影响其他代码的执行。
NaN 本身有两个非同寻常的特点:
1.任何涉及 NaN 的操作(例如 NaN /10)都会返回 NaN ,这个特点在多步计算中有可能导致问题。
2.NaN 与任何值都不相等,包括 NaN 本身。
5. 如何把非数值转化为数值?
在JS中一共有三种可以吧非数值转化为数值。分别是:Number ()
、parseInt ()
、parseFloat ()
Number()
1.如果是Boolean值,true 返回 1,false 返回 0
Number(true) //1
Number(false) //0
2.如果是数字,就是原样
Number(3.1415) //3.1415
3.如果是null,返回 0
Number(null) //0
4.如果是undefined,返回NaN
Number(undefined) //NaN
5.如果是字符串,有以下规则
- 如果是字符串中只包含数字(包括前面带正号或负号的情况),则将其转化成十进制数值。
Number ('123') //123
Number ('+123') //123
Number ('-123') //-123
Number ('0110') //110 前面的0会忽略
- 如果字符串中包含的有效的浮点数,就会转化成对应的浮点数,前面的0会忽略
Number ('3.1415') //3.1415
Number ('03.1415') //3.1415
- 如果字符串中包含有效的十六进制格式,前面为0x的格式,会自动转化成相同大小的十进制数。
Number ('0x11') //17
- 如果字符串是空字符串,则返回 0
Number ('') //0
- 如果字符串中包含上述格式外的其他字符,则转化成NaN。
var x
Number (x) //NaN
// 如果 x 没有用 var 声明过,就会报错。
parseInt ()
- parseInt方法用于将 字符串 转为整数。返回值只有两种可能,不是一个十进制整数,就是NaN。
parseInt ('520') //520 整数转化成整数
parseInt ('3.1415') //3 浮点数转化前面的整数部分
parseInt (' 11') //11 前面的空格会忽略
parseInt ('000011') //11 前面的0会忽略
- 如果parseInt的参数不是字符串,则会先转为字符串再转换。
parseInt(1.23) // 1
// 等同于
parseInt('1.23') // 1
- 字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。
parseInt('8a') // 8
parseInt('12**') // 12
parseInt('12.34') // 12
parseInt('15e2') // 15
parseInt('15px') // 15
//parseInt的参数都是字符串,结果只返回字符串头部可以转为数字的部分。
- 如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN。
parseInt('abc') // NaN
parseInt('.3') // NaN
parseInt('') // NaN
parseInt('+') // NaN
parseInt('+1') // 1
- parseInt方法还可以接受第二个参数(2到36之间),表示被解析的值的进制,返回该值对应的十进制数。默认情况下,parseInt的第二个参数为10,即默认是十进制转十进制。
parseInt('1000', 10) // 1000 以十进制解读(默认)
parseInt('1000', 2) // 8 以二进制解读
parseInt('1000', 6) // 216 以六进制解读
parseInt('1000', 8) // 512 以八进制解读
parseInt('10', 37) // NaN 进制超出范围,就返回 NaN
parseInt('10', 1) // NaN 进制超出范围,就返回 NaN
parseInt('10', 0) // 10
parseInt('10', null) // 10
parseInt('10', undefined) // 10 第二个参数是0、null、undefined 则直接忽略
parseFloat ()
- parseFloat用于将一个字符串转为浮点数。
parseFloat('3.14') // 3.14 浮点数转浮点数
parseFloat('314e-2') // 3.14
parseFloat('0.0314E+2') // 3.14 科学计数法转换
parseFloat ('3.14abc') // 3.14 转换前面的数值部分
parseFloat (' 3.14') // 3.14
parseFloat ('00003.14') // 3.14 前面的 0 和空格忽略
- 如果第一个字符不能转化成浮点数,就返回NaN
parseFloat([]) // NaN 空数组返回 NaN
parseFloat('FF2') // NaN 第一个字符不能转化浮点数
parseFloat('') // NaN 空字符串转化为 NaN
parseFloat () 和 Number () 的区别
parseFloat(true) // NaN
Number(true) // 1
parseFloat(null) // NaN
Number(null) // 0
parseFloat('') // NaN
Number('') // 0
parseFloat('123.45#') // 123.45
Number('123.45#') // NaN
6. ==与===有什么区别
一个比较数值等于,另一个比较数值和数据类型是否等于
7. break与continue有什么区别
-
break语句会立即退出循环,强制继续执行循环后面的语句。而continue语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行。
例子:
在i=5时,遇到break,强制退出for循环执行后面的alert(num)
在i=5时,遇到continue,此时num=4,结束这次循环,执行下一次循环,当i=10的时候,num=8,遇到continue,结束这次循环,执行下次循环。
8. void 0 和 undefined在使用场景上有什么区别
- void()运算符的作用是执行一个表达式,然后返回undefined
- 由于undefined不是JS的关键字,所以undefined可以在局部作用域中被覆写,而void运算返回都是undefined。
以下代码的输出结果是?为什么?
9.
- 在两个操作数都是数字的时候,会做加法运算
- 在两个参数都是字符串或在有一个参数是字符串的情况下回把另外一个参数转换为字符串做字符串拼接
- 在只有一个数字参数的时候返回其正数值
10.
- “++”的优先级高于“+”的优先级,所以a+++a=(a++)+a,由于a++是先赋值后运算,所以(a++)+a等效为1+a,由于前面a进行了赋值运算,所以现在a=2,所以1+a等效为1+2=3
11.
- a+++b等效为(a++)+b,由于a++要先赋值后运算,所以此时(a++)+b等效为1+b=4
12.
var arr = [3,4,5];
for (var i=0; i<arr.length; i++){
console.log(Math.pow(arr[i],2));
}
13. 遍历 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
由此题我们可以得到的解法是
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for(key in obj){
console.log(key,obj[key]);
}
14. 选做题
-
typeof a+b ||c>0,优先级从左到右依次降低,typeof a返回字符串number,在一个参数为字符串时,加号运算符执行拼接操作,所以typeof a+b得到的是number2,由于后面是或运算符,在前面非空的情况下不进行或操作,所以最终结果是number2
-
优先级:== 高于 && 高于=,所以由于d==5返回true,之后进行与操作,在第一个值为true的情况下,与操作返回第二个值:console.log('bb'),由于console.log('bb')是一个表达式,执行完毕后返回undefined,所以最后一步进行赋值操作 var data=undefined
-
||优先级高于=,所以优先进行 0||console.log('haha'),得到的返回值是undefined,所以最终data2=undefined
- ()优先级最高,其次是!,最后是+,则(!“world”,!!“from here”)返回布尔值true,!!“hello”返回布尔值true,两个为ture的布尔值相加为2,所以最终结果x=2