반응형

script로 3자리마다 콤마(,) 찍는 작업이 있어서 구글링하여 적용하였다.

 

구글링하여 얻은 정규식 표현법에는 

.toString().replace(/\B(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ",");

하지만 위 정규식에서의 ?<! 와 같은 표기법은 최신 기법으로, 익스 ~11, ios, safari 에서 통하지 않는 스크립트이다.

때문에 위처럼 넣게되면 함수 자체가 에러를 뱉어내므로, 스크립트를 호출하지 못하는 에러가 발생한다.

(object Error / function undefined)

(참고 url : caniuse.com/?search=lookbehind)

 

.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");

 

위와같이 정규식을 기술해야 익스, ios, safari 에서 정상적으로 함수를 호출할 수 있게 된다.

반응형
반응형

mouseEffect.html

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" type="text/css" href="../css/reset.css">
    <link rel="stylesheet" type="text/css" href="../css/mouseEffect.css">
    <script type="text/javascript" src="../js/common.js"></script>
</head>
<body>
    <div class="container">
        <h1>클릭시 마우스 효과</h1>
    </div>
</body>
</html>

mouseEffect.scss

@charset 'UTF-8';

.container{
    width:1080px; margin:0 auto;
    h1{padding:20px;border-bottom:1px solid #ccc;}
}

.clickEffect{
    position:fixed;
    box-sizing:border-box;
    border-style:solid;
    border-color:#111;
    border-radius:50%;
    animation:clickEffect 0.4s ease-out;
    z-index:99999;
}
@keyframes clickEffect{
    0%{
        opacity:1;
        width:0.5em; height:0.5em;
        margin:-0.25em;
        border-width:0.5em;
    }
    100%{
        opacity:0.2;
        width:15em; height:15em;
        margin:-7.5em;
        border-width:0.03em;
    }
}

common.js

//이벤트 function 정의
function clickEffect(e){
  var d=document.createElement("div");
    d.className="clickEffect";
    d.style.top=e.clientY+"px";
    d.style.left=e.clientX+"px";
    document.body.appendChild(d);
    d.addEventListener('animationend',function()
        {d.parentElement.removeChild(d);}.bind(this)
    );
}
//document에 clickEffect function 등록
document.addEventListener('click',clickEffect);

** 위 이벤트는 css 애니메이션 amimationend 이벤트를 지원해야 작동합니다.

IE10+ 이하 브라우저에서 호환하지 않습니다.

 

참고

반응형
반응형

ES5에서는 변수를 표현할 방법이 var 밖에 없었다.

var로 표현된 변수는 편리한만큼 제대로 쓰지 않으면 위험요소가 너무 많았다.

 

var 변수의 특징

1. 함수레벨 스코프

- 전역함수 외부에서 생성된 변수는 모두 전역변수의 취급을 받는다. 따라서 전역변수를 남발하게 될 가능성이 높다.

 

2. 변수 중복 선언 허용

var test = 'javascript';
console.log(test); // javascript

var test = 'typescript';
console.log(typescript); // typescript

test 라는 변수를 한번 더 선언했음에도, 그대로 test 변수에 담긴 값이 console.log의 위치에 따라 다르게 출력된다.

이는 '변수 - 여러가지 값으로 변할 수 있는 수' 라는 개념에는 맞을 수 있으나,

코드량이 많아지고 무분별하게 사용된다면 하나의 변수값으로 어디에서 사용되고 변화하는지 예측하기 힘들다.

 

코드의 수정이 있을때 역으로 한참을 올라가야 할 지도 모를 경우가 생길 수 있다.

 

이 외에도 여러가지 단점을 보완하기 위해 ES6에서 나온 변수 선언 방식이 letconst 이다.

 

let 변수의 특징

1. 블록레벨 스코프

- 코드블록(function, if, for, while, try/catch 등) 내에서 선언된 변수는 해당 블록 내에서만 유효하며, 선언된 변수는 지역변수이다.

 

2. 변수 중복 선언 불가

let test = 'javascript';
{
  let test2 = 'jquery';
}
let test = 'typescript';

console.log(test); // Uncaught SyntaxError: Identifier 'test' has already been declared
console.log(test2); // pen.js:24 Uncaught ReferenceError: test2 is not defined

console.log(test) - 이미 코드 최상위에 test라는 let 변수의 값으로 'javascript' 라는 값을 넣었고,

다시 test 변수에 'typescript' 라는 값으로 바꾸려니 이미 선언되었다는 에러를 뱉어낸다.

test2의 경우 let변수는 블록레벨 스코프이자 지역변수 이기 때문에, { } 범위를 벗어나서 console 을 찍게되면

선언되지 않았다는 에러를 뱉어내게 된다.

 

값을 바꾸고 싶다면, let test = 'typescript' 가 아닌 test = 'typescript' 로 해야한다.

let을 선언하는 순간 새로운 변수를 선언하는거와 같은 의미로 판단해, 이미 test라는 let변수가 존재한다고 하는 것이다.

let test = 'javascript';

test = 'typescript';

console.log(test); // typescript

 

const 의 특징

const는 상수값(변하지 않는 값)을 위해 사용된다. 기본적인 특징은 let과 동일하다.

다른점은 다음과 같다.

 

1. 재할당이 되지 않는다.

const test = 'javascript';

test = 'typescript';

console.log(test); //Uncaught TypeError: Assignment to constant variable.

2. 값이 무조건 바뀌지 않는 것이 아니다.

- 재할당이 불가능하다는 것은 const 변수 타입이 '객체' 인 경우, 참조값을 변경하지 못한다는 것을 의미한다.

- 하지만, 객체의 프로퍼티는 보호되지 않는다. 이는 할당된 객체의 내용(property의 추가, 삭제, 변경)은 변경이 가능하다는 것을 의미한다.

const user = {name: 'HwiDoorumi'};

// 1. user 객체의 참조값을 변경하려는 경우 
// user = {} //Uncaught TypeError: Assignment to constant variable.

user.name = 'Hwi';
console.log(user); // {name: 'Hwi'}

const로 선언된 user 객체는 name 이라는 key로 'HwiDoorumi' 라는 value 를 가진다.

따라서 user객체는 {name: 'HwiDoorumi'} 라는 참조값을 가지고 있으므로,

user = {} 라고 참조값을 변경하려고 했을때 에러를 뱉어내지만

name이라는 key를 가지는 property value인 'HwiDoorumi' 를 변경하는것은 가능하다는 것을 의미한다.

 

3. const 객체는 반드시 선언과 동시에 할당이 이루어져야 한다.

const test;

test = 'HwiDoorumi';

console.log(test); // Uncaught SyntaxError: Missing initializer in const declaration

var나 let의 경우, 위의 코드에서 에러를 뱉어내지 않는다.

하지만 const의 경우 위 코드를 해석하면

 

1. const 타입의 test 객체를 선언

2. test 객체를 'HwiDoorumi' 라는 값으로 변경 // 변수의 재할당 시도, 에러발생

 

const 객체의 특징에서 재할당이 불가능하다는 것에 위반된다. 따라서 const객체는 반드시 선언, 할당이 동시에 이루어져야 한다.

 

 

[참고] 변수의 선언, 초기화, 할당

[선언단계] - Declaration phase
변수를 실행 컨텍스트의 변수객체(Variable Object)에 등록한다.
이 변수 객체는 스코프가 참조하는 대상이 된다.

'variable Object' is not defined 라는 에러를 뱉어낸다면, 선언이 되지 않은 것을 의미한다.
[초기화 단계] - Initialization phase
변수 객체에 등록된 변수를 위한 공간을 메모리에 확보한다.
이 단계에서 변수는 undefined로 초기화 된다.

에러문구에서 'variable Object' is not defined 라는 에러를 뱉어낸다면
선언자체가 되지 않았다는 것이고, undefined 라는 에러를 뱉어낸다면
선언과 초기화는 되었지만, 값이 할당되지 않았다는 것을 의미한다.
[할당단계] - Assignment phase
undefiedn로 초기화된 변수에 실제 값을 할당하는 단계

 

반응형
반응형
function userSearch(){
    var keyword = 'c';
    var searchResult = [];

    var testArray = [
        {id: 'html', name: '에이치티엠엘'},
        {id: 'css', name: '스타일시트'},
        {id: 'jquery', name: '제이쿼리'},
        {id: 'javascript', name: '자바스크립트'},
    ]
    for(i=0;i<testArray.length;i++){
        if(testArray[i].id.includes(keyword)){
            searchResult.push(testArray[i].name);
        }
    }
    console.log("검색키워드 : ", keyword);
    console.log("검색후 새로 배열: ", searchResult);
}

위 코드는 키워드 'c'로 검색했을 때,

key:value 로 저장된 testArray 에서 'c'가 포함된 아이들을 재배열해서

보여주는 function 이다.

 

searchResult 라는 비어있는 배열을 생성하고,

for문으로 testArray의 length 만큼 돌리면서

i번째 id가 'c' 를 포함하고 있을 때 searchResult 배열에 push 하는 방식이다.

반응형
반응형

매개변수 개수에 따른 함수호출법


전달인자의 개수에 따라 서로 다른 처리를 해줘야하는 함수


호출된 인자 개수에 상관없이 이들 각각의 값을 모두 더해 리턴하는 함수의 예제이다.

이전 포스팅에서 확인 해보았듯이, 전달인자의 수와 호출함수의 매개변수의 수가 달라도 호출이 가능한 것을 이용한 예제이다.


function sum(){ var result = 0; for(var i=0; i<arguments.length; i++){ result = result+arguments[i]; // result(0) = 0 + 1 // result(1) = 1 + 2 console.log(result); } return result; } console.log(sum(1,2)); // 출력값 3

console.log(sum(1,2,3)) // 출력값 6

위의 예시에 대한 해설은 다음과 같다.


1. arguments(전달인자)의 length는 2이다.

2. for문을 통해 0번인덱스, 1번인덱스 총 두번의 루프가 돈다.

3. for문이 끝나면 result를 반환한다.


예시를 보면 함수의 개수를 arguments 객체로 받아서 for문으로 값이 끝날때까지 더한 후 result를 반환한다.


arguments객체는 유사배열 객체 로써, 전달받은 인자로 배열과 비슷한 형태를 가진다.


1. 함수로 호출할 때 넘겨진 인자(배열형태) : 함수를 호출할 때 첫번째 인자는 0번 인덱스, 두번째 인자는 1번 인덱스 등등

2. length 프로퍼티 : 실제 배열의 length가 아닌 유사배열 객체로서의 length. 함수를 호출할때 넘겨지는 인자의 개수를 의미

3. callee 프로퍼티 : 현재 실행 중인 함수의 참조값 (위의 객체에서는 sum() 함수가 callee 프로퍼티가 된다.)

* 전달인자의 개수에 상관없이 유사배열객체의 length 프로퍼티로 바인딩을 할 수 있다.


반응형
반응형

arguments 객체 - 매개변수


arguments 객체의 사용법


arguments란 전달인자로 통해 할당되는 일회성 매개변수 이다.

실제로 값이 존재하는것이 아닌, 전달인자에서 전달해주는 값에 의해 일회성으로 사용 되는 변수다.


이전 포스팅에서 자바스크립트는 느슨한 타입체크 라고 하였는데, 매개변수 에서도 상당히 유연하게? 전달인자를 받는다.

이 말은 함수를 호출할때 필요로 하는 매개변수의 수에 맞추지 않아도, 해당 함수를 호출할 수 있다는 것이다.


function argVar(arg1, arg2){

console.log(arg1, arg2)

}


argVar();           // undefined, undefined

argVar(1);          // 1 undefined

argVar(1, 2);       // 1 2

argVar(1, 2, 3);    // 1 2

위의 코드를 보면 argVar() 의 형식으로 argVar 함수를 호출하였다.


함수를 보면, 매개변수로 arg1과 arg2의 매개변수를 필요로 하지만,

아래 호출방식을 보면 전달인자의 수가 달라도 에러를 발생하지 않고 함수를 정상적으로 호출한다.


정리를 하면 다음과 같다.


1. 정의된 함수의 인자보다 적게 함수를 호출할 경우, 넘겨지지 않은 인자에는 undefined 값이 할당된다.

2. 정의된 함수의 인자가 함수의 매개변수보다 많을 경우, 초과된 전달인자는 무시된다.

3. 호출 함수명이 같다면, 매개변수의 수에 상관없이 에러를 발생시키지 않고 호출한다.




반응형
반응형

자바스크립트 참조타입


자바스크립트의 객체(=참조) 타입


이전 포스팅에서 말했듯이 자바 기본타입에는 number, string, boolean, null, undefined 가 있었다.

5가지 형태의 기본타입을 제외한 모든것은 '객체' 이며, 참조타입의 변수이다.


자바스크립트에서 변수란 이름(key) : 값(value) 형태의 프로퍼티들을 저장하는 컨테이너다.


자바스크립트 객체 생성방식


Object() 생성자 함수

var objVar = new Object(); // Object()생성자로 objVar 라는 빈 객체 생성


objVar.name = 'Hwi';

objVar.gender = 'male';

// objVar에 name, gender 프로퍼티 생성


console.log(typeof objVar); // objVar의 타입출력, 출력값 object

console.log(objVar) // '이름(key) : 값(value)' 형태로 객체 출력

// 출력값 {name:'Hwi', gemder:'male'}


객체 리터럴 방식 이용


리터럴 방식이란 객체를 생성하는 표기법으로, 중괄호{} 를 이용해서 객체를 생성한다. 프로퍼티 값으로는 어떠한 표현식도 올 수 있으며,

프로퍼티 값으로 함수가 있을 경우, 이를 자바스크립트에서 '메서드' 라고 호칭한다.

var objVar = {

name : 'Hwi',

gender : 'male'

};


console.log(typeof objVar); // Object() 생성자 함수 방식과 동일출력


생성자 함수 생성 방식


자바스크립트에서 함수를 생성하는 방법은 3가지가 있다.

함수 선언문 방식, 함수 표현식 방식, Function() 생성자 함수 방식이 있다.


- 함수 선언문 방식

함수 선언문 방식은 반드시 함수명이 정의되어 있어야 한다. C프로그래밍에서의 함수 정의 방식과 유사하지만,
function 키워드를 명시적으로 사용하고, 매개변수로 타입을 기술하지 않는다.

function addVar(x, y){ // 매개변수 x, y를 받는 함수 선언

return x + y; // x + y 의 값을 반환

}


console.log(addVar(3, 4)) // 출력값 7


- 함수 표현식 방식

자바스크립트 에서는 함수도 하나의 값처럼 취급된다. 따라서 함수도 숫자나 문자열 처럼 변수에 할당하는 것이 가능하다.

함수 리터럴로 하나의 함수를 만들고, 생성된 함수를 변수에 할당하여 생성하는 것을 함수 표현식 이라고 한다.

var addVar = function(x, y){ // 매개변수 x, y를 받는 함수를 addVar에 할당

return x + y; // x + y 의 값을 반환

}


console.log(addVar(3, 4)); // 출력값 7


- Function() 생성자 함수 방식

자바스크립트의 함수도 Function() 이라는 기본 내장 생성자 함수로부터 생성된 객체라고 볼 수 있다.

var addVar = new Function('x', 'y', 'return x + y');

console.log(add(3, 4));


생성자 함수 방식에서는 함수선언문, 함수표현식 방식이 자주 사용된다.

Function() 생성자 함수 방식은 실무에서 사용되는건 거의 보지 못하였고, 소스분석할 때 나오는 경우가 있다고 한다.


반응형
반응형

Javascript 기본 데이터 타입


기본 데이터 타입


- 자바스크립트에서 기본타입은 숫자(number), 문자열(String), 불린값(boolean) 그리고 null과 undefined가 있다.
기본데이터타입의 특징은 그 자체가 하나의 값을 나타낸다.
때문에 이름과 값을 프로퍼티로 가지는 객체의 개념과는 다르기 때문에, 객체가 아닌 하나의 변수이다.


숫자(number)


- 자바스크립트의 타입체크는 굉장히 너그롭다(?)
숫자형의 경우 C언어, 혹은 Java에서 int, float, double 등 다양하지만, 자바스크립트에서는 오로지 number 타입으로 존재한다.


※ 또한 자바스크립트 에서는 정수형이 따로 없고, 모든 숫자를 실수로 처리 하므로 

var num = 5 / 2; 를 출력하면 2.5 가 나오게 된다.

정수형만 추출하고 싶을땐, Math.floor(num); 이런식으로 자바스크립트 메서드를 사용해야 한다.

var intNum = 100;

console.log("intNum의 타입 == ", typeof intNum);

var floatNum = 8.5;

console.log("floatNum의 타입 == ", typeof floatNum);

위와같이 콘솔을 찍어보았을때 결과는 어떻게 나오는지 보면 알 수 있다.

C언어와는 다르게, 둘다 number 가 나오는 것을 알 수 있다.


※ typeof 연산자는 해당 변수나 객체가 어떤 타입인지를 체크하는 연산자 이다. 피연산자의 타입을 리턴해준다.



문자열(String)


- 문자열은 ''(작은따옴표) 나 ""(큰따옴표)로 표기한다. 기본데이터타입의 문자열의 경우 한번 정의된 문자열은 변하지 않는다.

var str = 'test';

console.log(str[0]); // 출력값 = t


str[0] = 'T'

console.log(str[0]); // 출력값 = t (변하지 않음)

여기서 오해의 소지가 있을 수 있는게, 문자열의 변환이 안된다는 뜻이 str은 평생 'test' 라는 문자열을 가지고 간다는 것이 아니다.

str의 값을 바꾸기 위해서는, str객체를 '재정의' 해야 한다는 뜻이다.

var str = 'test';

console.log(str[0]); // 출력값 = t


this.str = 'TEST';

console.log(str[0]); // 출력값 = T (str 변수가 'TEST'로 바뀜)


불린값(boolean)


- 불린값은 옳고 그름을 나타내는 변수다. true(참) / false(거짓) 의 두가지만을 값으로 가진다.

var blnVar = true;

console.log(typeof blnVar); // 출력값 boolean


if(blnVar){ console.log("조건식에 합당"); }else{ console.log("조건식에 부당"); }


※ 위 예시코드는 간단하게 if문으로 blnVar가 true를 가지고 있는지, false를 가지고 있는지 확인하였다.

boolean값을 활용하는 예시코드는 무궁무진하지만, 기본 사용법만 알아보았다.


null, undefined


- 자바스크립트에서 null과 undefined의 는 둘다 '값이 비어있음' 을 나타낸다. 차이가 있다면 null의 경우 값이 '비어있다'의 의미이고,

undefined의 경우는 '값이 할당되지 않음' 의 차이를 가지고 있다.


주의할 점은, null타입 변수의 경우는 타입체크를 할 때에, typeof 연산자의 결과값이 null이 아닌 object로 나오게 된다.

null타입 변수인지를 확인할때에는 일치연산자(===) 를 사용해서 변수의 값을 직접 확인해야 한다.

var nullVar = null;

console.log(typeof nullVar) // 출력값 object

console.log(nullVar === null) // 출력값 true


var emptyVar;

console.log(typeof emptyVar) // 출력값 undefined




반응형

+ Recent posts