# js 基础练习
* 写出三种种js引入方式并举例
  1. 外部引入 ```<script src="./main.js"></script>```
  2. 内部引入 ```<script>alert("hello world)</script> ```
  3. 在dom元素上使用script  ``` <button onclick="save()">提交</button> ```
* 下面两段代码，说明js文件的加载顺序并解释原因
    demo1:

    ```
    <script async src="js/vendor/jquery.js"></script>
    <script async src="js/script2.js"></script>
    <script async src="js/script3.js"></script>
    
    ```

    demo2
    ```
     <script defer src="js/vendor/jquery.js"></script>
    <script defer src="js/script2.js"></script>
    <script defer src="js/script3.js"></script>
    
    ```

  第一个（async 修饰的） 没法判断加载顺序   
  第二个（defer修饰的） 先加载 jquery.js 然后是 script2.js 最后是 script3.js

* 如果浏览器不支持javascript的语法需要在页面上提示您的浏览器不支持javascript 运行  如何实现
  在html 文件中写
  ```<noscript>您的浏览器不支持javascript 运行</noscript>```


* 列举几种js 交互方式
consol.log() document.write()  alert()  prompt() confirm()

* js的组成
ECMAScript  DOM   BOM 
* JavaScript 如何与 HTML 和 CSS 协同工作
html(结构)  css（样式） js(行为)


* 在外部文件中放置js脚本有什么优势

①简化HTML代码：将HTML代码中的JavaScript代码独立成外部文件，可以简化HTML文档中的代码，让HTML代码看起来更直观、清楚。

②编程模块化：可以将多个HTML文档中相同的JavaScript代码独立成外部文件，方便在多个HTML文档里引用。此时外部脚本文件相当于程序中的一个模块，如果修改该脚本文件的内容，所有引用该脚本文件的HTML文档中的部分也会被修改。

③代码易于维护：将JavaScript代码独立成外部文件，如果需要修改其中功能，只需要修改外部文件中的代码。如果所有JavaScript代码都嵌入HTML代码之中，那么即使要修改相同部分的内容，也必须修改所有HTML文件，修改的工作量较大。

④增加安全性：将JavaScript代码独立成外部文件，在查看HTML源代码时看不到JavaScript代码的内容，无形之中减少了受攻击的机会。

⑤加速浏览：浏览器会自动缓存网络中的文件。当一个外部脚本文件使用之后，浏览器会将其放入缓存中。如果另外一个HTML文档引用该外部脚本文件，浏览器就可以直接从缓存中读取该文件，而不需要从网络中下载，因此，会加快加载网页的速度。

⑥引用其他服务器上的文件的脚本文件：script元素中的src属性值是一个标准的URL，因此在HTML文档中除了可以引用当前服务器中的脚本文件，还可以引用其他服务器中的脚本文件。 

主要是1，2，3


变量和常量
* 如何交换两个变量的值
* 字面量和变量的关系及区别
  1.字面量是指由字母，数字等构成的字符串或者数值，它只能作为右值出现,(右值是指等号右边的值，如：int a=123这里的a为左值，123为右值。)

  2.常量和变量都属于变量，只不过常量是赋过值后不能再改变的变量，而普通的变量可以再进行赋值操作。 
* 变量命名规则

* 下面代码执行结果为  原因是
  ```
    var obj1 = new Object(); 
    var obj2 = obj1; 
    obj1.name = "Nicholas"; 
    alert(obj2.name);
  
  ```
  结果是 Nicholas
  原因（简单数据类型和复杂数据类型的区别）
    1.内存的分配不同  
      基本数据类型存储在栈中
      复杂数据类型存储在堆中，栈中存储的变量 是指向堆中的引用地址
    2.访问机制不同
      基本数据类型是按值访问 
      复杂数据类型是按引用访问


*  用一行语句声明5个变量 其中值包有一个只声明不赋值 其他分别为null 数值 字符串 布尔
数据类型

* 数据类型可以分为哪几类  有什么区别

* 如何实现功能 当浏览器不支持javascript脚本的时候  给用户在页面上提示“您的浏览器不支持javascript 脚本，请尽快升级浏览器”
* typeof 检测数据类型的返回值都有什么  分别代表什么意思
* 类型转换相关
   1. 输入两个数字，点求和弹出两个数字相加的结果。 
      1. 输入框的默认value进行相加，结果是进行了字符串相加，而非数字相加。
      2. 将value的值进行parseInt，之后再相加，就是数字相加的结果了。
      如果输入12+abc，会是什么结果？ 你得到了什么结论
      3.isNaN，检测输入框的内容是不是NaN。true为真，false为假。
      4.写出下面的执行结果
            1 + '1'           11
            true + 0       1
            {}+[]
            4 + {} 
            4 + [1] 
            'a' + + 'b'
            console.log ( [] == 0 )
            console.log ( ! [] == 0 )
            console.log ( [] == ! [] )
            console.log ( [] == [] )
            console.log({} == !{})
            console.log({} == {})

        1. 定义一个变量存储数据1234，分别输出个位，十位，百位，千位数字
        2. 输入两个数字，相减四舍五入（.toFixed() 把保留几位小数写在括号里）
        3. 从弹框中输入一个字符，判断这个字符是否是英文字母，数字，汉字（4e00-9fa5）
        4. 下面代码的输出结果
            console.log(10 + " cats");
            console.log(10 * " cats");
            Boolean([])
            console.log(10 + "2");
            console.log(10 - "2");
            Number("3")
            console.log(10 / "2");
            console.log(10 * "2");
            String(false)
            console.log(10 * " 2");
            console.log("10" * "2");
            console.log(Object(undefined));
            console.log(Object(null));

        5. 下面代码的执行结果
          var str = "abc";
          str[0] = "d"; 

        console.log(str[1]="e"); 
        console.log(str[0]); 
        console.log(str); 
        var num = [1,2,3];
        num[0] = "a";

        console.log(num);

        1.  下面代码的执行结果
            var obj1 = {age: 22};
            var obj2 = obj1; 

            console.log(obj1 === obj2);
            obj2.age = 18;
            console.log(obj1 === obj2); 

        2.  解释10，11结果出现的原因 并归纳基本数据类型和引用数据类型的区别

        3.  下面代码的输出结果
          var obj1 = {age: 22};
          var obj2 = obj1; 
          console.log(obj1 === obj2); 
          obj2.age = 18; 
          console.log(obj1 === obj2); 
          console.log("1" instanceof String);
          console.log(("1").constructor === String);
          console.log((1).constructor === Number);
          console.log((true).constructor === Boolean);
          console.log(([]).constructor === Array);
          console.log((function() {}).constructor === Function);
          console.log(({}).constructor === Object);
          console.log(1 instanceof Number);
          console.log(true instanceof Boolean);
          console.log([] instanceof Array);
          console.log(function(){} instanceof Function);
          console.log({} instanceof Object);
          var test = Object.prototype.toString;
          console.log(test.call("str"));
          console.log(test.call(1));
          console.log(test.call(true));
          console.log(test.call(null));
          console.log(test.call(undefined));
          console.log(test.call([]));
          console.log(test.call(function() {}));
          console.log(test.call({}));

