前端牛客网刷题总结【 JS基础变量、数据类型、数据类型转换、运算符等】

1.JavaScript是解释性语言。正确。体现在JS文件在完成之后,不会经过任何的编译。而是在运行时去解释执行。最好的例子就是,JS中一个函数有语法的错误,但是不会因为这个局部的错误而影响其他函数运行

2. JS是弱类型的语言。正确。

静态语言(强类型语言)

静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型。 
例如:C++、Java、Delphi、C#等。

动态语言(弱类型语言)

动态语言是在运行时确定数据类型的语言变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。 
例如PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell等等

3. JavaScript是面向对象的程序设计语言。 错误 。 面向对象语言提供了类、继承等成分,有识认性、多态性、类别性和继承性四个主要特点。而javascript没有这些

一、JS中的变量定义

 1.var,let,const定义的变量有什么区别?(这三者有什么区别)

let定义的变量不会挂载到window上

二、数据类型

1.基本数据类型(存储在栈中的简单数据段)
Number,string,boolean,undefined,null,Symbol
2.引用数据类型(存储在堆中的对象,存储在栈中的值是一个指针,指向 存储对象的内存地址)Object,Arrray,Function

访问obj的方式有两种

点的方式obj.arr;

中括号的方式obj["arr"];

let obj = {
  num1: 117
}
let res = obj;
obj.child = obj = { num2: 935 };
var x = y = res.child.num2;
console.log(obj.child);
console.log(res.num1);
console.log(y);

 输出:undefined、117、935

3.数据类型的判断方法
3.1 typeof:不能判断null,object,array,能识别函数

 <script>
        console.log(typeof 1);          //number
        console.log(typeof 'pipi');     //string
        console.log(typeof '');         //string
        console.log(typeof true);       //boolean
        console.log(typeof undefined);  //undefined
        console.log(typeof null);       //object
        console.log(typeof {});         //object
        console.log(typeof ['1', '2']); //object
        console.log(typeof Symbol());   //symbol
        console.log(typeof
            function() {});            //function
    </script>

 typeof Date.now() 的值是 Number   (返回一个时间戳)    (360集团2018)

3.2 instanceof

原理:通过原型链来实现,A(实例对象)instanceof B( 构造函数),可以判断这个 实例是否由这个构造函数所创建,或者这个实例是否继承于这个父类

        function Foo() {}
        var f1 = new Foo()
        console.log(f1 instanceof Foo); //true
        console.log(f1 instanceof Object); //true
        

        console.log([] instanceof Array); //true
        console.log(function() {} instanceof Function); //true
        console.log({} instanceof Object); //true
         console.log(null instanceof Object) // false,,美的笔试
       //通过字面量创建的基本数据类型,不是所属类的实例
        console.log("1" instanceof String); //false
        console.log(1 instanceof Number);//false
        console.log(true instanceof Boolean);//false
       

       //通过new关键字去创建基本数据类型
        console.log(new Number(1) instanceof Number);//true
        console.log(new String('1') instanceof String);//true
        console.log(new Boolean(false) instanceof Boolean);//true

 

        console.log('foo' == new function() {
            return String('foo')
        });//false
        console.log('foo' == new function() {
            return new String('foo')
        });//true
        console.log([] == 0); //true
        console.log(![]); //false
        console.log(!0); //true

 例题:下面这段程序的显示结果是?hi

var x = new Boolean(false);
if (x) {
  alert('hi'); 
}
var y = Boolean(0);
if (y) {
  alert('hello');  
}

var x = new Boolean(false); 用 new 调用构造函数会新建一个布尔对象,那么 x 就是一个 Boolean 类型的对象,若执行 if(x) 时,对象转布尔,始终是 true 

三、数据类型转换             

1.转换为数字型

perseInt()

parseFloat()

Number()强制转换

js隐式转换

关于 perseInt()

将字符串转换为整数,如果第二个参数为0或省略第二个参数的时候,转换为10进制;如果第二个参数为小于2或者大于32,结果为NaN

注意:

1.string字符串只会被解析从第一个字符开始直到不是数字的字符部分 console.log(parseInt('223'));//223

2 当字符串中间存在非数字,那么就只解析前面是数字的部分字符 console.log(parseInt('22e3'));//22

3 如果字符串中第一个字符就不是数字,那么返回NaN

console.log(parseInt('e21'));//NaN

4. 如果第一个参数前缀使用0x/0X则表示使用16进制 console.log(parseInt(0x99));//153=16*9+9

5.如果第一个参数使用了0x表示十六进制,那么第二个参数设置了值也无效

console.log(parseInt(0x99,10));

一些例题:

       console.log(parseInt('0xB')); //11

        console.log(parseInt('1', 1)); //NaN

        console.log(parseInt('1', 40)); //NaN

        console.log(parseInt('1', 2)); //1

        console.log(parseInt('2', 2)); //NaN

例题

[1,2,3].map(parseInt)返回什么

解析

1.map接收parseInt作为回调函数,相当于

[1,2,3].map((item,index)=>{

return parseInt(item,index)})

第一次遍历数组parseInt(1,0);//1

第一次遍历数组parseInt(2,1);//NaN

第一次遍历数组parseInt(3,2);//NaN

Number()强制转换

console.log(undefined + 1);  //NaN
解释:console.log(undefined + 1);  一元+操作符相当于Number()函数,会将undefined转化为数字,如果转化不了,那么就是NAN,所以会变为NAN+1 == NAN;结果就是NAN
  <script>
        console.log(Number(undefined)); //NaN
        console.log(Number('a')); //NaN
        console.log(Number({})); //NaN
        console.log(Number(true)); //1
        console.log(Number(null)); //0
        console.log(Number()); //0
        console.log(Number(0)); //0
        console.log(Number('')); //0
        console.log(Number([0])); //0
        console.log(Number(false)); //0
        console.log(Number([])); //0
    </script>

2.转换为布尔型

任何对象转为布尔值,都为得到 true(在 JS 中,只有 0,-0,NaN,"",null,undefined 这六个值转布尔值时,结果为 false)

3.转换为字符串

toString()

String()强制装换

加号拼接字符串 

四、代码回收规则

代码回收规则如下

1.全局变量不会被回收。
2.局部变量会被回收,也就是函数一旦运行完以后,函数内部的东西都会被销毁。
3.只要被另外一个作用域所引用就不会被回收

五、运算符

1.前置自增、后置自增

<script>
        var i = 5;
        var a = i++; //后置递增,表达式先返回原值(执行完该语句后),变量再自增
        console.log(i); //6
        console.log(a); //5

        var j = 5;
        var b = ++j; //前置递增,
        console.log(j); //6,变量先加1,再执行该语句
        console.log(b); //6

 </script>

        var c = 10;
        c++; 
        var d = c++ + 2
        console.log(d); //13


        var c1 = 10;
        ++c1; 
        var d1 = ++c1 + 2
        console.log(d1); //14

        var e = 10;
        var f = e++ + ++e;
        console.log(f);//22

所以以下代码输出10

<script>
 function out(x){
     var temp = 2;
     function inside(y){
         document.write( x + y + (temp--));
     }
     inside(5);
 }
 out(3);
 </script>

2、逻辑运算符

操作符之间的优先级(高到低):

算数操作符 → 比较操作符 → 布尔(逻辑)操作符 → “=”赋值符号

&&优先级高于||

&&左为真返回右边      123&&456,返回456      0&&456,返回0

|| 左为真返回左边        123||456||123+456,返回123

例1

var a = 4399 < 0 || typeof(4399 + '');
console.log(a);
||  这个是短路或,也就是||前面为true的话就直接等于前面的值了,不会再看||后面。
这里4399<0是false,所以还需要往后看,4399+''是字符串类型,typeof返回的是值的类型
所以在控制台输出的是String

3.一元运算符

"+new Array(017)" 这段代码输出为?()     NaN

相当于:

      a = new Array(017); 

        console.log(a instanceof Array); //true

        console.log(a.length);//得到的是一个长度为15的空数组

        console.log(+a); //NaN

解释:

一元运算符+

+Symbol => 报错

<script>
        console.log(+12); //12
        console.log(+'pipi'); //NaN,非数字样式的字符串 会转换为NaN
        console.log(+'14');//14,数字样式的字符串 会转换为字符串

     
        console.log(+true); //1
        console.log(+false); //0
        console.log(+null); //0
        console.log(+undefined); //NaN
        console.log(+{}); //NaN
        
        console.log(+[]); //0
 </script>

例题:

console.log(1+ "2"+"2");
console.log(1+ +"2"+"2");
console.log("A"- "B"+"2");
console.log("A"- "B"+2);

    122 32 NaN2 NaN 

  1. console.log(1+ "2"+"2");   //对于加法来说,如果只有一个操作数是字符串,则将另一个操作数也转换为字符串,然后将两者拼接,为122
  2. console.log(1+ +"2"+"2");   //(+"2")应用了一元加操作符,一元加操作符相当于Number()函数,会将 (+"2")转换为2,1+2+"2"=32
  3. console.log("A"- "B"+"2");   //在减法中遇到字符串和加法相反,调用Number()函数将字符串转换为数字,不能转换则返回NaN,此时运用加法规则,NaN+"2","2"是字符串,则将两者拼接。
  4. console.log("A"- "B"+2);   //这个与上面的不太相同,减法运算后依然为NaN,但是加号后面的为数字2,加法规则中,如果有一个操作数是NaN,则结果为NaN

总结:

    对于“+”来说,有两个含义:

    1,做字符串拼接,如果操作数里有一个是字符串,其他的值将被转换成字符串;

    2,加减法中的加法其他情况,操作数转换成数字执行加法运算。

   而对于“ - ”来说,只有一个含义,就是做减法,不会转化成字符串

  var foo = "10"+3-"1";

  console.log(foo);//结果是102

 关于精度的例题

下题的结果正确的是?

var one   = 0.1

 var two   = 0.2

var six   = 0.6

var eight = 0.8

[two - one == one, eight - six == two]    //true  false

https://blog.csdn.net/weixin_43465339/article/details/108182482

六、基本语句

1. break表示跳出循环,本次循环之后的都不执行

2. continue表示停止当前语句,并从头执行该语句

例1,最后输出x为3,不是2

var x=0; 
 switch(++x) { 
     case 0: ++x; 
     case 1: ++x; 
     case 2: ++x; 
 }

解释:

1.++x是前置自增,也就是先自增加1,再将x返回,所以switch表达式的值为1,匹配第二个case语句

2.同样对x进行前置自增,x的值变为2

3.由于没有使用break语句,在成功匹配后,会继续往下执行后面的case语句,也就是继续执行第三个case语句,最终x值为3

例2. 下面代码的输出为:啥也没有

var i = 0;
while( i < 40 ){
    if( i < 30 )
        continue;
    Document.write(‘########’);
    i++;
}

 解释:

continue语句只能用在while语句、do/while语句、for语句、或者for/in语句的循环体内,在其它地方使用都会引起错误!是停止当前语句,并从头执行该语句。

例3

var k = 0;
for(var i=0,j=0;i<10,j<6;i++,j++){
    k += i + j;
}
console.log(k)

考点:逗号表达式只有最后一项是有效的,即对于i<10,j<6; 来说,判断循环是否结束的是 j < 6

例4

 <script>
        for (var i = 1; i <= 5; i++) {
            if (i == 3) {
                break;
            }
            console.log('我正在吃第' + i + '个包子');
        }
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值