函数_预解析_对象

函数练习:

判断一个数是否是质数

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>这是标题</title>
 6     <script>
 7         function isPrime(x) {
 8             for (var i = 2; i * i <= x; i++) {
 9                 if (x % i == 0) {
10                     return 0;
11                 }
12             }
13             return 1;
14         }
15         // 判断 2-100 以内的素数
16         for(var i = 2;i<=100;i++){
17             var flag = isPrime(i);
18             if (flag){
19                 console.log(i + "是素数");
20             }
21         }
22     </script>
23 </head>
24 <body>
25
26 </body>
27 </html>

求一组数中的最大值和最小值:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>这是标题</title>
 6     <script>
 7         function max_array(arr) {
 8             var max =arr[0];
 9             for (var i = 1; i < arr.length; i++) {
10                 if(arr[i] > max){
11                     max = arr[i];
12                 }
13             }
14             return max;
15         }
16         var arr = [12,3,53,34,23,34,2,23];
17         var ret = max_array(arr);
18         console.log("最大值为 "+ ret);
19     </script>
20 </head>
21 <body>
22
23 </body>
24 </html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是标题</title>
    <script>
        function min_array(arr) {
            var min =arr[0];
            for (var i = 1; i < arr.length; i++) {
                if(arr[i] < min){
                    min = arr[i];
                }
            }
            return min;
        }
        var arr = [12,3,53,34,23,34,2,23];
        var ret = min_array(arr);
        console.log("最小值为 "+ ret);

    </script>

</head>
<body>

</body>
</html>

求一组数的最小值

求一组数的和:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>这是标题</title>
 6     <script>
 7         function sum_array(arr) {
 8             var sum = 0 ;
 9             for (var i = 0; i < arr.length; i++) {
10                 sum += arr[i];
11             }
12             return sum;
13         }
14         var arr = [12,3,53,34,23,34,2,23];
15         var ret = sum_array(arr);
16         console.log("总和为 "+ ret);
17     </script>
18 </head>
19 <body>
20
21 </body>
22 </html>

通过函数实现数组的反转:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>这是标题</title>
 6     <script>
 7         function reverse(arr) { //选择排序  从小到大
 8             var temp;
 9             for (var i = 0; 2*i < arr.length; i++) {
10                 temp = arr[i];
11                 arr[i] = arr[arr.length -i-1];
12                 arr[arr.length -i-1] = temp;
13             }
14             return arr;
15         }
16         var arr = [12,3,53,34,23,34,2,23];
17         console.log("逆序之前的数组"+ arr);
18         var ret = reverse(arr);
19         //逆序之后的数组
20         console.log(ret);
21     </script>
22 </head>
23 <body>
24 </body>
25 </html>

通过函数实现冒泡排序:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>这是标题</title>
 6     <script>
 7         function sort_byBubble(arr) { //冒泡  从小到大
 8             var temp ;
 9             for (var i = 0; i < arr.length - 1; i++) {
10                 for (var j = 0; j < arr.length - 1 - i; j++) {
11                     if (arr[j] >arr[j+1] ){
12                         temp = arr[j];
13                         arr[j] = arr[j+1];
14                         arr[j+1] = temp;
15                     }
16                 }
17             }
18             return arr;
19         }
20         var arr = [12,3,53,34,23,34,2,23];
21         var ret = sort_byBubble(arr);
22         //冒号排序之后的数组
23         console.log(ret);
24     </script>
25 </head>
26 <body>
27 </body>
28 </html>

通过函数实现选择排序:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>这是标题</title>
 6     <script>
 7         function sort_bySelect(arr) { //选择排序  从小到大
 8             var temp ;
 9             var min_idx;
10             for (var i = 0; i < arr.length ; i++) {
11                 min_idx = i;
12                 for (var j = i+1; j <arr.length ; j++) {
13                     if(arr[j] <arr[min_idx]){
14                         min_idx = j;
15                     }
16                 }
17                 if(min_idx!= i){
18                     temp = arr[min_idx];
19                     arr[min_idx] = arr[i];
20                     arr[i] = temp;
21                 }
22             }
23             return arr;
24         }
25         var arr = [12,3,53,34,23,34,2,23];
26         var ret = sort_bySelect(arr);
27         //选择排序之后的数组
28         console.log(ret);
29     </script>
30 </head>
31 <body>
32 </body>
33 </html>

js 中实现整除:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>这是标题</title>
 6     <script>
 7         console.log(parseInt(12/5));
 8     </script>
 9 </head>
10 <body>
11 </body>
12 </html>

arguments对象伪数组

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset = "UTF-8">
 5     <title>我是网站标题</title>
 6     <script>
 7     function f1(){
 8         console.log(arguments);  //输出的是个伪数组
 9     }
10     f1(1,2,3,4,5);
11     </script>
12
13 </head>
14 <body></body>
15
16 </html

输出的是:

可以通过 arguments.length 来获取输入参数的长度。

所以,上面的函数就可以简化为如下:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset = "UTF-8">
 5     <title>我是网站标题</title>
 6     <script>
 7     function func(){
 8         var sum =0;
 9         for(var i=0;i<arguments.length;i++){
10             sum += arguments[i];
11         }
12         return sum;
13     }
14     var ret = func(1,2,3,4,5);
15     console.log(ret);
16     </script>
17
18 </head>
19 <body></body>
20
21 </html>

这样只需要一个函数就可以搞定所有数字的求和运算了!

补:如果直接输入函数名字,输出的是函数的代码:

函数的其他定义方式:

匿名函数:

它不能直接调用,

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset = "UTF-8">
 5     <title>我是网站标题</title>
 6     <script>
 7     //普通函数
 8     function func(){
 9         console.log("Hello World!");
10     }
11     //匿名函数
12     var f =function (){
13         console.log("好帅哦");
14     };  //函数表达式后面一定要加分号,因为这里是赋值语句。
15     f();
16     </script>
17
18 </head>
19 <body></body>
20
21 </html>

下面看两种情况:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset = "UTF-8">
 5     <title>我是网站标题</title>
 6     <script>
 7     //普通函数
 8     function f1(){
 9         console.log("Hello World!");
10     }
11     f1();
12     function f1(){
13         console.log("我去!");
14     }
15     f1();
16
17
18     </script>
19
20 </head>
21 <body></body>
22
23 </html>//输出: 我去! (2) 此时,函数只是声明,程序执行的时候先看声明,之后再执行。

另外一种情况:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset = "UTF-8">
 5     <title>我是网站标题</title>
 6     <script>
 7     //普通函数
 8     f1 = function (){
 9         console.log("Hello World!");
10     };
11     f1();
12     f1 = function (){
13         console.log("我去!");
14     };
15     f1();
16     </script>
17
18 </head>
19 <body></body>
20
21 </html>输出:Hello World!我去!  此时就是,相当于变量了

它的好处有:

没有名字,根本就不会发生冲突。

它执行玩之后就会释放内存了!

小结:

函数的声明,函数表达式还有函数的自调用。

函数也是一种数据类型:

输出是:function  .

函数作为参数使用:

函数作为返回值使用:

作用域:

预知:

全局变量和局部变量

它们分别对应全局作用域和局部作用域。

在其他语言中,还有块级作用域,但是js 中没有块级作用域。

小结:只有函数内部定义的是局部变量,其他都是全局变量。

我们使用的时候尽量要使用局部变量,而不是全局变量,因为局部变量在函数执行完毕之后就会释放空间了。

隐式全局变量:

还有个问题:

输出是:number

    undefined

小结:全局变量不能被删除,隐式全局变量可以被删除。

作用域链:

预解析:

不仅仅是变量,函数的声明也会被提前。

注:Python 中不会预解析的。

预解析案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset = "UTF-8">
    <title>我是网站标题</title>
    <script>
    function f1(){
        console.log(num);
        var num = 10;  //var  num  会提到当前作用域的最上面,仍然在{}  内
    }
    f1();
    console.log(num); //报错
    </script>

</head>
<body></body>

</html>

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset = "UTF-8">
 5     <title>我是网站标题</title>
 6     <script>
 7
 8     f1();
 9     console.log(c);
10     console.log(b);
11     console.log(a);  //此处报错,其余都是9, b,c 不报错因为它们是隐式全局变量。
12
13     function f1(){
14         var a= b =c =9;
15         console.log(a);
16         console.log(b);
17         console.log(c);
18     }
19     </script>
20
21 </head>
22 <body></body>
23
24 </html>

查资料:

MDN

例如:

对象:

下面的内容概括:

js 不是面向对象的语言,但是它是一门基于对象的语言。

js 没有继承和多态的概念,它没有面向对象的三大特性,只能说有封装。

但是,它可以模拟出三大特性。

创建对象的三种方式:

第一种:调用系统的构造函数来创建对象。

 1 <!DOCTYPE=html>
 2
 3 <html lang="en">
 4 <meta charset=‘UTF-8‘>  <title>这是网页标题</title>
 5
 6 <head>
 7     <script>
 8          var person = new Object();
 9          person.name  = "tom";
10          person.age = 18;
11
12     </script>
13
14 </head>
15 <body>
16 </body>
17 </html>

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>这是网页标题</title>
 6
 7     <script>
 8         var person = new Object();
 9         //添加属性
10         person.name = "tom";
11         person.age = 18;
12
13         //添加方法
14         person.sleep = function () {
15             console.log("我要睡觉了")
16         }
17         person.eat = function () {
18             console.log("我要吃饭了")
19         }
20
21         console.log(person.name);
22         console.log(person.age);
23
24         person.sleep();
25         person.eat();
26
27     </script>
28 </head>
29 <body>
30
31 </body>
32 </html>

给对象添加属性和方法

第二种:自定义构造函数创建对象(结合第一种,通过工厂模式创建对象)。

现在有两个问题:

第一个问题:如何一次性创建多个对象。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <meta charset = "UTF-8">
 4     <title>这是网页</title>
 5     <head>
 6         <script>
 7             function createObject(name,age) {
 8                 var obj = new Object();
 9                 obj.name = name;
10                 obj.age = age;
11                 obj.sayHi = function () {
12                     console.log("Hello My Name is : "+ obj.name+" 我今年: "+this.age+" 岁");
13                 };
14                 return obj;
15             }
16             var person = createObject("tom",18);
17             person.sayHi();
18
19             var dog = createObject("wangcai",10);
20             dog.sayHi();
21
22
23
24         </script>
25     </head>
26     <body>
27
28     </body>
29 </html>

利用函数封装,达到快速创建多个对象

其实这就是工厂模式创建对象。

下面是第二个问题:

如何分辨出对象到底是什么类型。

主要是通过自定义构造函数,

首先知道Object() 是系统的构造函数,所以,对于如何创建自定义的构造函数,可以参考系统的。

Object()函数的定义方式,我们可以查到:

它的构造函数和函数很类似

函数和构造函数的区别

看首字母是否是大写,大写的是构造函数,小写的是正常的函数。

注:构造函数也可以当普通函数使用。但是尽量要用大写表示类。

完整的类(自定义的构造函数)如下:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <meta charset = "UTF-8">
 4     <title>这是网页</title>
 5     <head>
 6         <script>
 7             function Person(name, age) {  //Person是个自定义的类 。类似于系统的  Object
 8                 this.name = name;
 9                 this.age = age;
10                 this.sayHi = function () {
11                     console.log("Hello World, My Name : "+this.name + "! My Age: "+this.age);
12                 }
13             }
14             var person = new Person("egon",18);
15             person.sayHi();
16         </script>
17     </head>
18     <body>
19
20     </body>
21 </html>

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <meta charset = "UTF-8">
 4     <title>这是网页</title>
 5     <head>
 6         <script>
 7             function Person(name, age) {  //Person是个自定义的类 。类似于系统的  Object
 8                 this.name = name;
 9                 this.age = age;
10                 this.sayHi = function () {
11                     console.log("Hello World, My Name : "+this.name + "! My Age: "+this.age);
12                 }
13             }
14             var person = new Person("egon",18);
15             person.sayHi();
16
17             console.log(person instanceof Person);  //true
18             console.log(person instanceof Object);  //true
19             function Dog() {}
20             console.log(person instanceof Dog); //false
21         </script>
22     </head>
23     <body>
24     </body>
25 </html>

instanceof 的使用

========================================================

自定义对象做了四件事(即var obj = new Person()  系统一共 做了四件事 )  :

第三种:字面量的方式创建对象:

它等同于:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <meta charset = "UTF-8">
 4     <title>这是网页标题</title>
 5     <head>
 6         <script>
 7             var person = {
 8                 name :"egon",
 9                 age :18,
10                 sayHi:function () {
11                     console.log("Hello World, "+this.name+" I am  My age is : "+this.age);  //都是不能直接用 name ,age
12                 }
13             };
14             person.sayHi();
15         </script>
16     </head>
17     <body>
18     </body>
19 </html>

#############################################

字面量创建对象的缺陷:

最后一个

js是一门动态类型的语言:

1,代码(变量)只有执行到相应位置才知道具体是什么类型。

2,对象,只要是通过.点了什么就增加了相应的对象 或方法。

==============================================

除了点之外,使用另一种访问属性的方式(中扩号的方式):

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <meta charset = "UTF-8">
 4     <title>这是网页标题</title>
 5     <head>
 6         <script>
 7             function Person(name, age) {
 8                 this.name = name ;
 9                 this.age = age;
10             }
11             var person =new Person("egon",18);
12             person.sex = "男";
13             person.sayHi = function () {
14                 console.log(this.name + this.age+this.sex);
15             };
16             // console.log(person.name);
17             // console.log(person.age);
18             // person.sayHi();
19
20             // 不仅仅可以 用点点方式来访问属性
21             //也可以用下面的中括号的方式来访问属性
22             console.log(person["name"]);
23             console.log(person["age"]);
24             person["sayHi"]();
25         </script>
26     </head>
27     <body>
28     </body>
29 </html>

JSON 格式的数据及遍历:

JavaScript Object Notation(标记)

json也是个对象,

但是,没有赋值,所以是underfined .

遍历json格式的数据:

主要是通过for in 循环:

for in 循环可以用于,不知道Json 种具体的索引的时候遍历数据。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <meta charset = "UTF-8">
 4     <title>这是网页标题</title>
 5     <head>
 6         <script>
 7             var json={
 8                 "name":"egon",
 9                 "age":18,
10                 "sex":true
11             };
12             //遍历json 的数据
13             for (var key in json){
14                 console.log(key);  //注意,key此时是个变量,不是json 对象的属性,
15                 // console.log(json.key); //如果直接 console.log(json.key)  的话,相当于新增属性(新增变量key),但是没有赋值,会输underfined
16                 //应该如下方式:
17                 // console.log(json[key]); //这样才是输出相应的数据。
18             }
19             //补充:
20             //上面的新增属性
21             // console.log(json.key);
22             //因为json.key = "aaaa"  就相当于新增到对象种 “name” = "aaaa" 这个 所以,如果直接 json.key 会输出underfined.
23         </script>
24     </head>
25     <body>
26     </body>
27 </html>

简单类型和复杂类型:

值类型和引用类型传递:

内置对象:

常见的内置对象:

作业:MDN 查

原文地址:https://www.cnblogs.com/zach0812/p/11518003.html

时间: 2024-11-10 08:14:17

函数_预解析_对象的相关文章

进击JavaScript核心 --- (2)函数和预解析机制

一.函数 每个函数都是 Function类型的实例,也具有属性和方法.由于函数也是一个对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 1.函数的定义方式 (1).函数声明 function add(a, b) { return a + b; } 函数声明提升:在执行代码之前,会先读取函数声明,也就是说,可以把函数声明放在调用它的代码之后 fn(); // 1 function fn() {console.log(1)} (2).函数表达式 var add = functio

F火狐 不能对 {}括号内的 函数进行预解析

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <script> // alert(a);// ... alert( fn1 );// F火狐 不能对{}括号内的函数进行预解析 var a = 1

2. 原型链_作用域链_预处理_预解析

1. 谈谈原型 能够实现继承,对象查找属性的规则 实例对象的隐式原型的值 为其 对应构造函数的 显式原型的值 prototype 显示原型属性 所有函数都有显示原型属性 __proto__ 隐式原型属性 所有实例对象都有隐式原型属性 所有函数都是 Function 的实例 Function 是通过 new 自己产生的实例 2. 谈谈原型 由多个隐式原型属性构成的链状结构就是原型链 作用: 用来查找对象的 属性/方法 先自身找,找不到再去 __proto__ 找,最终找到 Object.proto

作用域,预解析,对象,内置方法 Math Date Array

作用域 一段程序代码中所用到的名字并不总是有效可用的,而限定这个名字(变量)的可用性的代码范围,就是这个名字的作用域,作用域提高了逻辑程序的局部性,增强了可靠性,减少了名字冲突: JavaScript作用域(es6)之前:全局作用域,局部作用域 全局作用域:整个script标签或者是一个单独的JS文件 局部作用域(函数作用域):在函数内部就是作用域: 变量作用域 全局变量:在全局作用域下声明的变量:如果在函数内部没有声明(var)直接赋值的变量也是全局变量 num = 2; 局部变量:在函数内部

死磕JavaScript变量和函数的预解析

预解析:在解析代码之前做一些处理 预解析做什么处理? 把变量的声明提前了----提前到当前所在的作用域的最上面 函数的声明也会被提前---提前到当前所在的作用域的最上面 那么我们现在开始举几个例子 1.观察下方的第一个红框中的代码,猜猜它的结果是什么? 通过运行我们发现,代码竟然神奇的没有报错?但是输出的也不是下面赋值的1而是undefined,这到底是为什么呢?其实这就是因为js引擎的预解析将num这个变量的声明提前到作用域的最上方(num是全局变量所以提前到最外层也就是script标签内的最

JS——变量和函数的预解析、匿名函数、函数传参、return

JS解析过程分为两个阶段:编译阶段.执行阶段.在编译阶段会将函数function的声明和定义都提前,而将变量var的声明提前,并将var定义的变量赋值为undefined. 匿名函数: window.onload = function () { var oBtn01 = document.getElementById('btn01'); var oBtn02 = document.getElementById('btn02'); //注意这里不能有括号,skin01()的话就立刻执行了哦,所以不

25.函数例题-预解析 作用域 、函数变量优先级、全局变量污染(直接在全局声明 、 函数里的变量没声明)但是函数里的变量没声明造成的全局变量污染有个前提,函数要被调用)

1.  return foo()   foo 没有return值,故为undefined.   2.      a b 在函数作用域内,外界找不到   var a = b =3; b 也算用var 声明了,只不过b 是在全局隐式var 了一个b ,在函数内部找不到变量的情况下就去全局找,全局找不到报错.    语法有错误,程序一句都不会执行,执行阶段有错误,会执行没错的代码,在执行出错的地方报错.  函数或则匿名函数体内声明变量是为了避免全局变量污染 重要例题:  函数没执行,全局没找到 b报错

关于作用域和预解析的不常见重要知识

作用域和预解析 在javascript中作用域是非常重要的,本文章将会说明作用域,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家走入一些误区. 谈及作用域先就必须要说明预解析和词法作用域. 下面我们先说明一下: 预解析 代码在正常执行操作之前会对文档进行一次解析,这个操作就是将声明提升, 声明包括全局范围内  1.带有var的变量, 2.函数 文档预解析后会把文档中在全局函数中的内容储存起来,将全局中带有var的变量(var和变量名,注意:变量体不会随着提升,加载va

JavaScript中作用域和预解析

作用域以及预解析 在javascript中作用域是非常重要的,本文章将会说明作用域以及我们在工作,以及面试中的一些面试题,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家走入一些误区. 谈及作用域先就必须要说明预解析和词法作用域. 下面我们先说明一下: 预解析 代码在正常执行操作之前会对文档进行一次解析,这个操作就是将声明提升, 声明包括全局范围内 1.带有var的变量, 2.函数 文档预解析后会把文档中在全局函数中的内容储存起来,将全局中带有var的变量(var和变量