精华内容
下载资源
问答
  • 以下ES5中被称为基本表达式(Primary Expression)this、null、arguments等内置的关键字变量。即一个已声明的标识符字面量。仅包括数字字面量、布尔值字面量、字符串字面量、正则字面量分组表达式,即用来表示立刻...

    表达式:是由运算元和运算符(可选)构成,并产生运算结果的语法结构。以下在ES5中被称为基本表达式(Primary Expression)this、null、arguments等内置的关键字变量。即一个已声明的标识符字面量。仅包括数字字面量、布尔值字面量、字符串字面量、正则字面量分组表达式,即用来表示立刻进行计算的这类表达式是原子表达式,是无法再分解的表达式。除基本表达式以外,还有如下表达式,称为复杂表达式,这类表达式需要其它表达式参与:对象的初始化表达式、数组的初始化表达式:分明也是字面量的一种,但不把它们算作基本表达式,是因为对象字面量、数组字面量所包含的成员也都是表达式。数组初始化表达式语法如下:[expression,expression,expression]

    可以有0个及其以上个子表达式
    对象的初始化表达式如下:{
    expression1: expression2,
    expression1: expression2,
    expression1: expression2
    }
    在ES5及其之前,expression1只能是字符串字面量;

    ES6开始支持如下语法:

    {
    [expression1]: expression,
    [expression1]: expression,
    [expression1]: expression
    }

    expression1可以是任何返回值为字符串或Symbol类型的表达式
    函数定义表达式(注意,需与函数声明语句区分开)属性访问表达式:之前一直以为跟在对象后面的句点或者方括号是运算符,实际上不是,它们是属性访问表达式的语法结构的一部分。属性访问表达式语法如下:expression.identifier

    其中,expression可以是任意的表达式,identifier是属性名(必须合法)
    或者expression1[expression2]

    其中,两个expression可以是任意的表达式
    expression2的值会被转化为字符串(除非它是一个Symbol类型)
    调用表达式: 分为“方法调用”与“函数调用”。方法调用的语法是:expression0([[expression1[,expression2[,expression3]]])

    其中,expression是一个返回值为函数对象的属性访问表达式,小括号提供一个逗号分隔的参数列表。函数调用的语法是:expression0([expression1[,expression2[,expression3]]])

    其中,expression0是一个返回值为函数对象的表达式,
    小括号提供一个逗号分隔的参数列表
    可见,小括号并非一个操作符,而是调用表达式的语法的一部分对象创建表达式:语法如下:new expression0([expression1[,expression2[,expression3]]])

    其中,expression0是一个返回值为函数对象的表达式,
    小括号提供一个逗号分隔的参数列表(整个小括号内部的参数列表是可以省略的)可见,小括号并非一个操作符,而是调用表达式的语法的一部分----------------以上所有表达式,由于未使用运算符,称为单值表达式。除此之外的叫做复合表达式JavaScript表达式总有返回值,其中,单值表达式的结果是值本身,其他表达式结果是根据运算符进行运算的结果值。由于每个表达式都有返回值,因此每个表达式都能作为“邻近”的表达式的运算元参与运算。可以将无限个表达式“邻近”地连接成复合表达式总结:分类如下单值表达式:不使用运算符的表达式简单表达式:不能再分解的表达式复杂表达式:需要其它表达式参与的表达式复合表达式:由运算符将多个单值表达式结合而成的表达式所有表达式均有返回值===============================语句:JavaScript代码由语句构成,表明了执行过程的流程、限定和约定,形式上可以是单行语句,也可以是由大括号括起来的复合语句。语句由分号来分隔。语句是“使某事发生”的指令,不存在返回值一说当语句位于以下地点之一时,可以省略分号(不会出现语法错误,但可能造成执行阶段的错误):一行的最后整个代码文件的最后在语法分隔符之前(如复合语句的大括号“}”)复合语句的大括号“}”之后其它情况下遗漏分号,会在语法分析过程中报错,全部代码完全不执行。语句中比较特殊的一类是表达式语句,表示“只有表达式,没有其它语法元素的语句”,例如:1+2+3;
    就是一个表达式语句。
    作者:郑航
    链接:https://www.zhihu.com/question/39420977/answer/81250170
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • 答案: 当 Vue 处理指令时,v-for 比 v-if 具有更高的优先级,这意味着 v-if 将分别重复运行于每个 v-for 循环中。...取而代之的是,我们只检查它一次,且不会 v-if 为否的时候运算 v-for。 参与互动 ...

    答案:

    当 Vue 处理指令时,v-for 比 v-if 具有更高的优先级,这意味着 v-if 将分别重复运行于每个 v-for 循环中。通过 v-if 移动到容器元素,不会再重复遍历列表中的每个值。取而代之的是,我们只检查它一次,且不会在 v-if 为否的时候运算 v-for。

    参与互动

    展开全文
  • 我们正常使用模板的时候都是将声明定义放一起. 这里要注意的是 模板不是一种数据类型! 他既不是函数也不是类,他是生成这两者的 “模板”!这个概念可能有点绕, 举例来说: 我有一张 设计图(template), 这个设计图...

    我们正常使用模板的时候都是将声明和定义放在一起.

    • 这里要注意的是 模板不是一种数据类型! 他既不是函数也不是类,他是生成这两者的 “模板”!这个概念可能有点绕, 举例来说: 我有一张
      设计图(template), 这个设计图是用来制作板凳的.
      那么光有这张设计图,我是没法使用的.我需要有材料,或者说指定用什么材料去做板凳,比如我要用木头或者用塑料之类的.当我有了这些材料之后,再按照图纸去制作出了板凳才能真正被使用.
    • 到这里再说说编译器对于模板的处理. 编译器看到模板之后,就比如是一名木匠看到了图纸,光看到图纸的话 木匠是什么都做不了的.他只能等到别人要求他制作板凳,并且告诉他需要用什么材料去做,才会真的动手去生产出一个板凳.

    下面看一个实际的例子:
    你现在要为别人提供一个库, 那么常用的做法是

    1. 写一个头文件,将函数定义放在这里.
    2. 写一个源文件 包含头文件,将实现放在这里. 因为你并不想要别人知道怎么实现的,只要知道怎么用就行了.
    3. 将他编译成 静态库或者动态库 提供给别人使用.

    但是现在问题来了,头文件里有一个 模板函数!
    类似如下:

    //foo.h
    #pragma once
    template <class T>
    void print(T t);
    
    //foo.cpp
    #include "foo.h"
    #include <iostream>
    using namespace std;
    template <class T>
    void print(T t){
    	cout << "Hi,"<<t << endl;
    }
    
    //main.cpp
    //这里通过链接库的方式使用函数 print. 
    #include "foo.h"
    int main(int argc, char** argv){
    	print<int>(3);
    	return 0
    }
    

    到这里看着好像没有问题. 那么回想一下我们刚刚举得例子, 木匠(编译器) 拿到了图纸(print函数的模板),想要将他变成一个 凳子(动态库或者静态库) 给别人使用.
    我们是不是缺少了什么?
    对! 我们缺了材料! 我不知道别人需要什么材料!
    那么这个时候我们的动态库里保存了什么呢? 什么也没有! 因为我们不知道生成什么类型的凳子!
    对应编译器的错误就是 undefined reference!

    那么我们有什么办法解决这个问题呢? 本文提供两种方法:

    1. 我将 foo.cpp 内容添加到 foo.h中 变成了,这样 main.cpp中就知道了 模板的声明和定义. 可以自己生成一个 “凳子”. 但是这就违背了我们生成库的初衷. 别人已经知道了我们的实现!
    2. foo.cpp修改为
    //foo.cpp
    #include "foo.h"
    #include <iostream>
    using namespace std;
    template <class T>
    void print(T t){
    	cout << "Hi,"<<t << endl;
    }
    template void print<int>(int);
    

    这样做相当于,我提前告诉木匠 要做一个"int"类型的凳子. 这样库里就包含了这个凳子. 别人可以拿过去直接用.
    这样做也有一个坏处. 因为你不知道别人想要用什么凳子. 你就得准备"float" “double” "char"各种类型的凳子了…

    更多关于模板的问题可以参考这里:
    FAQ about template in c++

    展开全文
  • <div><p>MsgRawMsgInfo分别再什么时候用啊?全部用MsgInfo不行吗?</p><p>该提问来源于开源项目:name5566/leaf</p></div>
  • ArrayList 内部用什么实现的?

    千次阅读 2018-07-08 15:38:29
    小伙伴的笔试面试过程中很多时候都会遇到关于ArrayList的问题,回答这样的问题,不要只回答个皮毛,可以介绍一下 ArrayList 内部是如何实现数组的增加删除的,因为数组创建的时候长度是固定的,那么就有个...

      在小伙伴的笔试和面试过程中很多时候都会遇到关于ArrayList的问题,回答这样的问题,不要只回答个皮毛,可以再介绍一下 ArrayList 内部是如何实现数组的增加和删除的,因为数组在创建的时候长度是固定的,那么就有个问题我们往 ArrayList 中不断的添加对象,它是如何管理这些数组呢?

      ArrayList 内部是用 Object[]实现的。接下来我们分别分析 ArrayList 的构造、add、remove、clear 方法的实现 原理。

    一、构造函数

      1)空参构造

    /**
    * Constructs a new {@code ArrayList} instance with zero initial capacity.
    */
    public ArrayList() {
        array = EmptyArray.OBJECT;
    }
    

      array 是一个 Object[]类型。当我们 new 一个空参构造时系统调用了 EmptyArray.OBJECT 属性,EmptyArray 仅仅是一个系统的类库,该类源码如下:

    public final class EmptyArray { 
        private EmptyArray() {}
    
        public static final boolean[] BOOLEAN = new boolean[0]; 
        public static final byte[] BYTE = new byte[0];
        public static final char[] CHAR = new char[0]; 
        public static final double[] DOUBLE = new double[0]; 
        public static final int[] INT = new int[0];
    
        public static final Class<?>[] CLASS = new Class[0]; 
        public static final Object[] OBJECT = new Object[0]; 
        public static final String[] STRING = new String[0];
        public static final Throwable[] THROWABLE = new Throwable[0];
        public static final StackTraceElement[] STACK_TRACE_ELEMENT = new StackTraceElement[0];
    }
    

      也就是说当我们 new 一个空参 ArrayList 的时候,系统内部使用了一个new Object[0]数组。

      2)带参构造 1

    /**
    *	Constructs a new instance of {@code ArrayList} with the specified
    *	initial capacity.
    *
    *	@param capacity
    *	the initial capacity of this {@code ArrayList}.
    */
    public ArrayList(int capacity) { 
        if (capacity < 0) {
            throw new IllegalArgumentException("capacity < 0: " + capacity);
        }
        array = (capacity == 0 ? EmptyArray.OBJECT : new Object[capacity]);
    }
    

      该构造函数传入一个 int 值,该值作为数组的长度值。如果该值小于 0,则抛出一个运行时异常。如果等于 0,则使用一个空数组,如果大于 0,则创建一个长度为该值的新数组。 

      3)带参构造 2

    /**
    *	Constructs a new instance of {@code ArrayList} containing the elements of
    *	the specified collection.
    *
    *	@param collection
    *	the collection of elements to add.
    */
    public ArrayList(Collection<? extends E> collection) { 
        if (collection == null) {
            throw new NullPointerException("collection == null");
        }
    
        Object[] a = collection.toArray();
        if (a.getClass() != Object[].class) { 
            Object[] newArray = new Object[a.length];
            System.arraycopy(a, 0, newArray, 0, a.length); a = newArray;
        }
        array = a;
        size = a.length;
    }

      如果调用构造函数的时候传入了一个Collection 的子类,那么先判断该集合是否为 null,为 null 则抛出空指针异常。如果不是则将该集合转换为数组 a,然后将该数组赋值为成员变量 array,将该数组的长度作为成员变量 size。这 里面它先判断 a.getClass 是否等于 Object[].class,其实一般都是相等的,我也暂时没想明白为什么多加了这个判断, toArray 方法是 Collection 接口定义的,因此其所有的子类都有这样的方法,list 集合的 toArray 和 Set 集合的 toArray 返回的都是 Object[]数组。

    二、add 方法

      add 方法有两个重载,这里只研究最简单的那个。

    /**
    *	Adds the specified object at the end of this {@code ArrayList}.
    *
    *	@param object
    *	the object to add.
    *	@return always true
    */
    @Override 
    public boolean add(E object) { 
        Object[] a = array;
        int s = size;
        if (s == a.length) {
            Object[] newArray = new Object[s +(s < (MIN_CAPACITY_INCREMENT / 2) ? MIN_CAPACITY_INCREMENT : s >> 1)];
            System.arraycopy(a, 0, newArray, 0, s); array = a = newArray;
        }
        a[s] = object; 
        size = s + 1; 
        modCount++; 
        return true;
    }
    

      1、首先将成员变量 array 赋值给局部变量 a,将成员变量 size 赋值给局部变量 s。

      2、判断集合的长度 s 是否等于数组的长度(如果集合的长度已经等于数组的长度了,说明数组已经满了,该重新 分配新数组了),重新分配数组的时候需要计算新分配内存的空间大小,如果当前的长度小 于 MIN_CAPACITY_INCREMENT/2(这个常量值是 12,除以 2 就是 6,也就是如果当前集合长度小于 6)则分配 12 个长度,如果集合长度大于 6 则分配当前长度 s 的一半长度。这里面用到了三元运算符和位运算,s>> 1,意思就是将s 往右移 1 位,相当于 s=s/2,只不过位运算是效率最高的运算。

      3、将新添加的 object对象作为数组的 a[s]个元素。 

      4、修改集合长度 size 为 s+1

      5、modCotun++,该变量是父类中声明的,用于记录集合修改的次数,记录集合修改的次数是为了防止在用迭代 器迭代集合时避免并发修改异常,或者说用于判断是否出现并发修改异常的。

      6、returntrue,这个返回值意义不大,因为一直返回 true,除非报了一个运行时异常。

    三、remove 方法

      remove 方法有两个重载,我们只研究 removeint index)方法。

    /**
    *	Removes the object at the specified location from this list.
    *
    *	@param index
    *	the index of the object to remove.
    *	@return the removed object.
    *	@throws IndexOutOfBoundsException
    *	when {@code location < 0 || location >= size()}
    */
    @Override 
    public E remove(int index) { 
        Object[] a = array;
        int s = size;
        if (index >= s) { 
            throwIndexOutOfBoundsException(index, s);
        }
        @SuppressWarnings("unchecked") 
        E result = (E) a[index];
        System.arraycopy(a, index + 1, a, index, --s - index); 
        a[s] = null;  // Prevent memory leak
        size = s; 
        modCount++; 
        return result;
    }
    

      1、先将成员变量 array 和 size 赋值给局部变量 a 和 s。

      2、判断形参 index 是否大于等于集合的长度,如果成了则抛出运行时异常

      3、获取数组中脚标为 index 的对象 result,该对象作为方法的返回值 

      4、调用 System 的 arraycopy 函数,拷贝原理如下图所示。


      5、接下来就是很重要的一个工作,因为删除了一个元素,而且集合整体向前移动了一位,因此需要将集合最后一 个元素设置为 null,否则就可能内存泄露。

      6、重新给成员变量 array 和 size 赋值

      7、记录修改次数

      8、返回删除的元素(让用户再看最后一眼)

    四、clear 方法

    /**
    *	Removes all elements from this {@code ArrayList}, leaving it empty.
    *
    *	@see #isEmpty
    *	@see #size
    */
    @Override 
    public void clear() { 
        if (size != 0) {
            Arrays.fill(array, 0, size, null); 
            size = 0;
        modCount++;
        }
    }
    

      如果集合长度不等于 0,则将所有数组的值都设置为 null,然后将成员变量 size 设置为 0 即可,最后让修改记录加 1。


      本文简单分析了ArrayList的内部是如何实现的,参考了Java面试宝典,帮助大家简单的理解一下,如有错误,请联系博主。

    展开全文
  • 那么这几个函数分别应用在什么场景下呢?我们接下来大家一起来捣鼓捣鼓这几个函数的用法: 首先来看看的最多的函数Vlookup,相信很多学习Excel的朋友一上来估计就被Vlookup 弄得头昏脑胀,不懂,听懂了没?...
  • 大家都知道Java中一共有两种选择语句分别是switch与if语句,但究竟什么时候用?用哪一种好呢?这一直是大家心中的一个小疑虑。现在简单的回顾switch与if语句的基本构造,深入了解它们的使用区别。首先回顾下...
  • 大家都知道Java中一共有两种选择语句分别是switch与if语句,但究竟什么时候用?用哪一种好呢?这一直是大家心中的一个小疑虑。现在简单的回顾switch与if语句的基本构造,深入了解它们的使用区别。首先回顾下...
  • 大家都知道Java中一共有两种选择语句分别是switch与if语句,但究竟什么时候用?用哪一种好呢?这一直是大家心中的一个小疑虑。现在简单的回顾switch与if语句的基本构造,深入了解它们的使用区别。首先回顾下...
  • 大家都知道Java中一共有两种选择语句分别是switch与if语句,但究竟什么时候用?用哪一种好呢?这一直是大家心中的一个小疑虑。现在简单的回顾switch与if语句的基本构造,深入了解它们的使用区别。首先回顾下...
  • 大家都知道Java中一共有两种选择语句分别是switch与if语句,但究竟什么时候用?用哪一种好呢?这一直是大家心中的一个小疑虑。现在简单的回顾switch与if语句的基本构造,深入了解它们的使用区别。首先回顾下...
  • 大家都知道Java中一共有两种选择语句分别是switch与if语句,但究竟什么时候用?用哪一种好呢?这一直是大家心中的一个小疑虑。现在简单的回顾switch与if语句的基本构造,深入了解它们的使用区别。首先回顾下...
  • 大家都知道Java中一共有两种选择语句分别是switch与if语句,但究竟什么时候用?用哪一种好呢?这一直是大家心中的一个小疑虑。现在简单的回顾switch与if语句的基本构造,深入了解它们的使用区别。首先回顾下...
  • console.log的时候用它的变量名字符,这样也是没有问题的。 <p>\u十六进制字符的这种表示法同样只适用于BMP的字符,所以如果我们试图使用它转义增补字符,直接这样是不行的: <pre><code>...
  • 下面,我们先分别来看看TCPUDP的优缺点,后面,来分析一下,什么时候TCP、什么时候UDP。 TCP的优点: 可靠,稳定 TCP的可靠体现TCP传递数据之前,会有三次握手来建立连接,而且数据传递...
  • sql中的Alias怎么

    2015-05-17 09:43:00
    一直很奇怪,不知道为什么sql的Alias怎么,上次看到ThinkPHP中的讲解,为什么数据库在用时候时候喜欢改个别名再用, 因为昨天去参加了公司的数据库开发工程师的笔试,今天就复习一下sql,看到SQL的Alias的...
  • 数据结构: 考虑什么是数据结构时,首先我们先来看这么...python中,我们常用列表与字典来存储数据,现在我们就分析一下,如果我们分别使用这两种数据结构的时候,他们的算法效率那个会更好一点:列表保存数据...
  • 但都有"发布时间"字段,我个人认为不能分别从四张表中查出该用户发布的所有信息进行拼接,如果数据多的话会很慢,而且无法实现排序功能,所以我想的是只能查询的时候就分页查询,但想了好久也不知道如何实现这种...
  • 数据库备份,只需要拷贝最近1个月内的数据库备份到另一台服务器就行. 而且只是windows作业来执行. ...网上最多的也是最简单的,也就是分别取出年月日,做加减后拼接回来. 如: echo %date:~0,4%-%date:~5,2%-%da
  • TCPUDP

    2015-03-03 14:23:31
    下面,我们先分别来看看TCPUDP的优缺点,后面,来分析一下,什么时候TCP、什么时候UDP。 TCP的优点: 可靠,稳定 TCP的可靠体现TCP传递数据之前,会有三次握手来建立连接,而且数据传递时,有...
  • 食指按住刀叉柄,先叉子把食物按住,然后刀切成小块,再用叉送入嘴内。吃东西往往是身子坐直,刀叉或者勺子将食物送到嘴里,最好不要低头吃。因此,食物切的时候也要切得小块一些。 刀叉的用法有欧式美式...
  • 王争《设计模式之美》学习笔记 为什么不推荐使用继承? 文中作者以鸟类举例,...换个思路的话,鸟类下面设计两个子类,会飞鸟类不会飞鸟类,让会飞的鸟不会飞的鸟分别继承,三级层级。看似还算融洽。 按照...
  • 昨天我只是将数据库附加到SQL2012,然后各个数据库都做了收缩事务日志的操作 ...我们同一个数据库,分别附加到SQL2005上SQL2012上,看一下附加之后数据库的文件头有没有改变 这个数据库的兼容级别
  • 下面举个栗子:比如一个部门里面有很多成员,这两者分别保存部门表成员表里面,删除某个部门的时候,假设我们默认删除对应的成员。但是执行的时候可能会出现这种情况,我们先删除部门,删除成员,但是部门...
  • 什么是VLAN

    2013-10-23 09:59:12
     VLAN是为解决以太网的广播问题安全性而提出的一种协议,它以太网帧的基础上增加了VLAN头,VLAN ID把用户划分为更小的工作组,限制不同工作组间的用户互访,每个工作组就是一个虚拟局域网。虚拟局域网的好处...
  • 四个方向键的键码分别是37(左)、38(上)、39(右)40(下)。 然后我写了下面的代码: $div就是要移动的层,且它的position已CSS中设为relative。瞄一眼好像没什么问题,运行之后发现下面的问题: 1.按了向...
  • private final ReentrantReadWriteLock theLock = new ReentrantReadWriteLock(); private final Lock writeLock = theLock.writeLock(); private final Lock ...这遍文章我看过,我不明白,具体在什么时候用读写锁

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 514
精华内容 205
关键字:

在和再分别什么时候用